Як тло командного ланцюга?


15

Я хочу створити на зразок командного ланцюга, як cp a b && mv b c && rm a.

Я намагався робити, cp a b && mv b c && rm a &але це лише фони останнього процесу.

Як я можу створити фон командного ланцюга?

Відповіді:


22

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; } &

8
Basnder bash , { ... ; } &зробіть вилку на поточному рівні процесу, тоді як ( ... ) &робіть вилку з нижньої частини корпусу ... Результат такий же, але все одно є тонка різниця.
Ф. Хаурі

14

ви можете помістити його в парантези, як, (cp a b && mv b c && rm a )&щоб включити весь ланцюг.


2
І що важливо, це дає зрозуміти, що весь ланцюг є фоновим, навіть для того, хто може не знати правил обмеження операторів
jackweirdy

2
Подивіться на мій коментар до відповіді @ Жилла, я вважаю { ... ; }, що це краща форма (спосіб).
Ф. Хаурі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.