У меня есть строка сценария запуска:
pyprogramm >> /dev/null 2>&1 &
Значения:
>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)
но что делает самое последнее &
средний?
Запаздывание &
оператор в конце команды используется для помещения команд в фон. Это - на самом деле стандартный синтаксис, указанный стандартом 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, означает что все подобные Границе оболочки, означая bash
, dash
, и ksh
должен поддерживать его.
&
в перенаправлении отличается от &
как управляют разделителем. Это означает копировать (копирование) объекта дескриптора файла. Посмотрите то, Что делает и означает точно в перенаправлении вывода?
В bash
существует также |&
оператор (не отмечают пространства между каналом и амперсандом). Из руководства удара:
Если | и используется, стандартная погрешность команды, в дополнение к ее стандартному выводу, подключена к стандартному входу command2 через канал; это - сокращение от 2> &1 |. Это неявное перенаправление стандартной погрешности к стандартному выводу выполняется после любых перенаправлений, указанных командой.
Это означает, выполняет команду в фоновом режиме. Сценарий выполнения вызова продолжается вместо того, чтобы блокироваться, пока названная команда не завершается.
&
это возвращает управление сценария к операционной системе, но отправило ответ на фон не как nohup
это непосредственно отправляет все выполнение