Каково значение и в конце команды?

У меня есть строка сценария запуска:

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

Значения:

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

но что делает самое последнее & средний?

11
задан 6 January 2019 в 01:45

3 ответа

Что и разделитель?

Запаздывание & оператор в конце команды используется для помещения команд в фон. Это - на самом деле стандартный синтаксис, указанный стандартом 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 |. Это неявное перенаправление стандартной погрешности к стандартному выводу выполняется после любых перенаправлений, указанных командой.

16
ответ дан 23 November 2019 в 03:58

Это означает, выполняет команду в фоновом режиме. Сценарий выполнения вызова продолжается вместо того, чтобы блокироваться, пока названная команда не завершается.

3
ответ дан 23 November 2019 в 03:58

& это возвращает управление сценария к операционной системе, но отправило ответ на фон не как nohup это непосредственно отправляет все выполнение

0
ответ дан 23 November 2019 в 03:58

Другие вопросы по тегам:

Похожие вопросы: