Яке значення & в кінці команди?


12

У мене є рядок сценарію запуску:

pyprogramm >> /dev/null  2>&1 &

Значення:

>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)

але що означає саме останнє &?

Відповіді:


16

Що таке & термінатор?

Оператор трейлінгу &в кінці команди використовується для перенесення команд на другий план. Це фактично стандартний синтаксис, визначений стандартом POSIX :

Асинхронні списки

Якщо команду припиняє оператор управління ('&'), оболонка повинна виконувати команду асинхронно в підшалі. Це означає, що оболонка не повинна чекати завершення команди перед виконанням наступної команди.

Формат для запуску команди у фоновому режимі такий:

command1 & [command2 & ...]

Метою фонових команд є запуск команди без основної оболонки в скрипті або інтерактивної оболонки, що чекає на команду, яка б блокувала виконання інших команд і створювала б незручність для очікування користувача. Це зручно для запуску тривалих команд, але вам потрібно продовжувати роботу в поточній оболонці. Як ви здогадуєтесь, це походило з часів, коли не було емуляторів терміналів з декількома вкладками, але термінали були фактичним фізичним обладнанням, підключеним до самого комп'ютера.

З цього визначення видно, що &також виконує функції термінатора команд для списків команд, як ;і у випадку. У вашому конкретному прикладі pyprogramm >> /dev/null 2>&1 &в списку є лише одна команда.

Послідовний; списки проти асинхронних та списки

Більш загально,

echo Hello ; echo World ;

і

echo Hello & echo World &

є два приклади списків, припинених операторами ;та &. Одна відмінність полягає в тому, що до &припиненого списку буде підключено вхід, /dev/nullякщо контроль роботи відключений:

Якщо контроль роботи відключений (див. Встановити, -m), стандартний вхід для асинхронного списку, перш ніж виконувати явні перенаправлення, вважатиметься призначеним файлу, який має ті ж властивості, як / dev / null. Це не відбудеться, якщо ввімкнено контроль роботи. У всіх випадках явна перенаправлення стандартного вводу повинна переважати цю діяльність.

Однак у послідовному списку кожна команда все ще stdinпідключена до терміналу, якщо немає явних перенаправлень.

Зауважимо також, що з визначення, яке ми згадували раніше, &виконуються команди в нижній частині. На відміну від цього, ;завершений список виконується в поточній оболонці. Існує також різниця у статусах виходу. Для &стандарту сказано:

Статус виходу асинхронного списку повинен дорівнювати нулю.

Це важливо, коли ви хочете поставити кілька команд у фоновому режимі. Коли ви пишете сценарій або команду, вам доведеться вибирати команди, для яких вам не байдуже, чи не вдалось це зробити, чи вам доведеться знайти спосіб обробки ненульового (помилки) стану виходу. У вашому конкретному прикладі pyprogramm >> /dev/null 2>&1 &біг у фоновому режимі повинен мати певний спосіб вказувати, якщо він не вдався чи ні, однак, судячи з того, що ви використовуєте, 2>&1ви приховуєте вихід помилок шляхом перенаправлення, і ви, ймовірно, припускаєте, що сценарій не повинен виходити з ладу.

Навпаки, ;статус виходу визначається як:

Статус виходу послідовного списку є статусом виходу останньої команди зі списку.

Знову ж таки, це має значення щодо того, як ви пишете послідовний список команд у командному рядку та як ви хочете обробляти речі, якщо частина команд у списку не вдалася.


Бічні нотатки та додаткове читання

  • Справа в тому , що це засіб визначення POSIX , що все Bourne-подібних оболонок, маючи в увазі bash, dashі kshповинні підтримати його.

  • &в перенаправлення відрізняється від &командного термінатора. Це означає дублювання (копіювання) об’єкта файлового дескриптора. Дивіться, що саме означає перенаправлення виводу?

  • В bashє також |&оператор (зверніть уваги не простір між трубою і амперсандом). З посібника з bash :

    Якщо | & використовується, стандартна помилка команди, крім стандартного виводу, підключається до стандартного вводу command2 через трубу; це скорочення для 2> & 1 |. Це неявне перенаправлення стандартної помилки на стандартний висновок виконується після будь-яких перенаправлень, визначених командою.


2
Те, що ви говорите про &приховування вихідних даних, не звучить правильно. Абзац із стандарту, який ви цитуєте, говорить про введення , а не про вихід . Причина розмежування між ввімкненим чи ні контролем роботи полягає в тому, що фоновий процес, який намагається прочитати з tty, буде призупинено. У цей момент вам потрібно використовувати контроль роботи, щоб поставити його на перший план, щоб забезпечити вхід, який його чекає. Все це неможливо зробити без контролю за роботою, тому, якщо контроль роботи відключений, stdin потрібно переадресовувати з іншого /dev/nullеквівалента.
kasperd

Я також помітив помилку у вашій редакції. В одному місці ви написали ввімкнено, де ви повинні писати вимкнено.
kasperd

@kasperd Так, я просто перечитував сторінку POSIX, коли також помітив це. Вже виправлено. Повідомте мене, чи потрібно ще щось редагувати. Дякую :)
Сергій Колодяжний

3

Це означає запустити команду у фоновому режимі. Сценарій виклику триває, а не блокується, поки не буде виконана викликана команда.


0

&це повертає контроль над сценарієм в операційну систему, але надсилає відповідь на задній план не так, nohupщо безпосередньо надсилає все виконання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.