Я хочу фон командную цепочку, как 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 )&включить всю цепочку.
{ ... ; }это предпочтительная форма (способ).
{ ... ; } &сделать вилку на текущем уровне процесса, в то время как( ... ) &сделать вилку из субоболочки ... Результат такого же, но есть небольшая разница в любом случае.