Я хочу фон командную цепочку, как cp a b && mv b c && rm a
.
Я пытался сделать, cp a b && mv b c && rm a &
но это только фоны последнего процесса.
Как мне создать фоновую цепочку команд?
Я хочу фон командную цепочку, как cp a b && mv b c && rm a
.
Я пытался сделать, cp a b && mv b c && rm a &
но это только фоны последнего процесса.
Как мне создать фоновую цепочку команд?
Ответы:
cp a b && mv b c && rm a &
правильно. &
имеет более низкий приоритет, чем &&
. На самом деле &
имеет более низкий приоритет, чем что-либо, кроме ;
и newline: &
находится в той же синтаксической категории, что и;
, что отличается тем, что ;
запускает список команд на переднем плане, а &
запускает его в фоновом режиме. Вы можете проверить это для себя:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
То же самое с pdksh, ksh93, bash, csh, tcsh.
Исключением является zsh, что странно несовместимо. Это задокументировано в руководстве :
Если подсписок завершен
&
,&|
или&!
, оболочка выполняет последний трубопровод в ней в фоновом режиме, а не ждать его , чтобы закончить (обратите внимание на отличие от других оболочек , которые выполняют весь подсписок в фоновом режиме).
К сожалению, zsh ведет себя таким образом даже в режиме совместимости с sh или ksh. Чтобы убедиться, что вся команда выполняется в фоновом режиме, поставьте вокруг нее скобки или скобки. Круглые скобки создают подоболочку, тогда как фигурные скобки - нет, но это не имеет значения (за исключением микрооптимизации в некоторых оболочках), поскольку задняя команда в любом случае находится в подоболочке.
{ cp a b && mv b c && rm a; } &
Вы можете поместить это в паратезы, как (cp a b && mv b c && rm a )&
включить всю цепочку.
{ ... ; }
это предпочтительная форма (способ).
{ ... ; } &
сделать вилку на текущем уровне процесса, в то время как( ... ) &
сделать вилку из субоболочки ... Результат такого же, но есть небольшая разница в любом случае.