Что означает & в конце команды?
У меня есть строка сценария запуска:
pyprogramm >> /dev/null 2>&1 &
Значения:
>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)
но что делает самый последний & имею в виду?
3 ответа
Что такое терминатор?
Трейлинг & оператор в конце команды используется для помещения команд в фоновый режим. На самом деле это стандартный синтаксис, определенный стандартом POSIX:
Асинхронные списки
Если команда завершается оператором управления ( '&'), оболочка должна выполнить команду асинхронно в подоболочке. Это означает, что оболочка не должна ждать завершения команды перед выполнением следующей команды.
Формат для запуска команды в фоновом режиме:
команда1 & [команда2 & ... ]
Целью фоновых команд является выполнение команды без основной оболочки в сценарии или интерактивной оболочки в ожидании команды, которая блокирует выполнение других команд и создает неудобства для пользователя в ожидании. Это удобно для запуска длительных команд, но вам нужно продолжить работу в текущей оболочке. Как вы можете догадаться, это произошло в то время, когда не было эмуляторов терминалов с несколькими вкладками, но терминалы были фактическим физическим оборудованием, подключенным к самому компьютеру.
Из определения вы можете видеть, что & также служит разделителем команд для списков команд, так же, как ; делает. В вашем конкретном примере pyprogramm >> /dev/null 2>&1 & в списке только одна команда.
Последовательный; списки против асинхронных и списки
В более общем смысле,
echo Hello ; echo World ;
а также
echo Hello & echo World &
два примера списков, завершенных ; а также & операторы. Одно отличие состоит в том, что & завершенный список будет иметь вход, связанный с /dev/null если управление заданиями отключено:
Если управление заданиями отключено (см. Set, -m), стандартный ввод для асинхронного списка перед выполнением любых явных перенаправлений должен считаться назначенным файлу, имеющему те же свойства, что и /dev/null. Этого не должно быть, если включен контроль заданий. Во всех случаях явное перенаправление стандартного ввода должно переопределять это действие.
В последовательном списке, однако, каждая команда по-прежнему имеет stdin подключен к терминалу, если нет явных перенаправлений.
Отметим также, что из определения, которое мы упоминали ранее, & выполняет команды в подоболочке. В отличие от ; Завершенный список выполняется в текущей оболочке. Также есть разница в статусах выхода. За & стандарт гласит:
Статус выхода асинхронного списка должен быть нулевым.
Это важно, когда вы хотите поместить несколько команд в фоновом режиме. Когда вы пишете сценарий или команду, вам придется выбирать команды, для которых вам все равно, потерпели ли они неудачу или нет, или вам придется искать способ обработки ненулевого (ошибочного) состояния выхода. В вашем конкретном примере pyprogramm >> /dev/null 2>&1 & работа в фоновом режиме должна иметь какой-то способ указать, если это не удалось или нет, однако судя о том, что вы используете 2>&1 вы скрываете вывод ошибок путем перенаправления, и вы, вероятно, предполагаете, что скрипт не должен завершиться ошибкой.
В отличие от ; Статус выхода определяется как:
Состояние выхода из последовательного списка должно быть состоянием выхода последней команды в списке.
Опять же, это влияет на то, как вы пишете последовательный список команд в командной строке, и на то, как вы хотите, чтобы что-то обрабатывалось в случае сбоя некоторых команд в списке.
Дополнительные заметки и дополнительное чтение
Тот факт, что это определение POSIX означает, что все Bourne-подобные оболочки, то есть
bash,dash, а такжеkshдолжен поддержать это.&в перенаправлении отличается от&как командный терминатор. Это означает дублирование (копирование) объекта дескриптора файла. См. Что именно означает и означает в перенаправлении вывода?В
bashсуществует также|&оператор (обратите внимание, нет места между трубой и амперсандом). Из руководства Bash:Если используется |&, стандартная ошибка команды, в дополнение к стандартному выводу, подключается к стандартному вводу command2 через канал; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых перенаправлений, указанных в команде.
Это означает запустить команду в фоновом режиме. Вызывающий сценарий продолжается, а не блокируется до завершения вызываемой команды.
& это возвращает управление сценарием операционной системе, но отправляет ответ в фоновом режиме не как nohup который напрямую отправляет все исполнение