Я хочу створити на зразок командного ланцюга, як 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 &
правильно. &
має нижчий пріоритет ніж &&
. Фактично &
має нижчий пріоритет, ніж будь-який інший, ніж ;
новий рядок: &
знаходиться в тій же синтаксичній категорії ;
, що й різниця полягає в тому, що він ;
виконує список команд на передньому плані, а &
запускає його у фоновому режимі. Ви можете перевірити це на собі:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Те саме з pdksh, ksh93, bash, csh, tcsh.
Виняток - zsh, який дивно несумісний. Це задокументовано в посібнику :
Якщо підпис перерваний a
&
,&|
або&!
, оболонка виконує останній конвеєр у ньому у фоновому режимі, і не чекає його закінчення (зверніть увагу на різницю від інших оболонок, які виконують весь підпис у фоновому режимі).
На жаль, zsh поводиться таким чином навіть у режимі сумісності sh або ksh. Щоб переконатися, що вся команда виконується на задньому плані, поставте навколо неї дужки або круглі дужки. В дужках створюють підзаголовки, тоді як дужки - ні, але це не має значення (за винятком мікрооптимізації в деяких оболонках), оскільки фонова команда все-таки знаходиться в нижній частині.
{ cp a b && mv b c && rm a; } &
ви можете помістити його в парантези, як, (cp a b && mv b c && rm a )&
щоб включити весь ланцюг.
{ ... ; }
, що це краща форма (спосіб).
{ ... ; } &
зробіть вилку на поточному рівні процесу, тоді як( ... ) &
робіть вилку з нижньої частини корпусу ... Результат такий же, але все одно є тонка різниця.