Почему выполненный команда оболочки Linux с '& '?

Я использую Red Hat версия 5 Linux Enterprise. Я заметил людей, иногда выполняющих команды с несколькими & опции. Например, в ниже команды, существуют два & знаки. Какова цель их? Они всегда используются вместе с nohup?

nohup foo.sh <script parameters> >& <log_file_name> &
30
задан 13.04.2019, 22:40

6 ответов

В дополнение к Martin, ответы Пепла и Kevin, иногда Вы будете видеть амперсанд, используемый математически для поразрядного AND*:

$ echo $(( 11 & 7 ))
3

В случае, если Вы не знакомы с разрядными операторами:

11: 1011
 7: 0111
-------- AND
 3: 0011

В каждом положении существует один бит в первом числе И втором числе, установите тот бит на один в ответе.

*Функция в ответе Kevin упоминается как логическое И.

Для разработки ответ Ash при использовании в перенаправлении амперсанд может сказать оболочке копировать дескриптор файла. В этой команде echo "hello" > outputfile 2>&1 амперсанд вызывает любой вывод, который может перейти к стандартной погрешности (stderr, дескриптор файла 2) для движения в то же место как стандартный вывод (stdout, дескриптор файла 1, значение по умолчанию для левой стороны >). >& outputfile оператор является сокращением от > outputfile 2>&1.

Кроме того, новый в Bash 4, существует два новых разделителя для пунктов в case команда ;& и ;;& которые влияют, "проваливается" ли случай и, если так, выполняется ли следующий тест.

15
ответ дан 07.12.2019, 09:15

В сценарии оболочки Bash амперсанд “&\” привык к процессам ветвления:

find -name hello &

Это заставит команду находки быть разветвленной и выполненной в фоновом режиме (можно всегда уничтожать его его PID).

32
ответ дан 07.12.2019, 09:15

Почему выполненный команда оболочки Linux с '& '?

Вернуть Вашу подсказку сразу и выполнить процесс в фоновом режиме.

Какова функция их?

nohup позволяет фоновому процессу продолжать работать даже после того, как пользователь выходит из системы (или выходит из оболочки инициирования).

> И перенаправления и стандартный вывод и стандартная погрешность в файл журнала.

И выполнения все это в фоновом режиме, дав Вам Вашу подсказку назад сразу.

Объяснение:

Каждый процесс Linux открывает три канала ввода-вывода, вход "stdin", стандартный вывод "stdout" и стандартная погрешность произвел "stderr". Они могут использоваться для двоичного файла, но они - традиционно текст. Когда большинство программ видит, что stdin закрывается, они выходят (это может быть изменено программистом).

Когда родительская оболочка выходит, stdin закрывается на детях, и (часто, обычно), дети выходят также. Кроме того, дети получают сигнал программного обеспечения, SIGHUP, указывая, что пользователь "завис" (раньше, модем), и значение по умолчанию здесь должно выйти также. (Отметьте, программист может изменить все это при записи программы).

Так, что делает nohup, дают дочернему процессу отдельную среду ввода-вывода, связывая входы и выходы к чему-то не связанному с родительской оболочкой, и экранируя ребенка от сигнала SIGHUP. После того как пользователь разъединяется, Вы будете видеть, nohup фоновый процесс, принадлежавший init (обработайте 1), не оболочка пользователя.

Однако nohup не может сделать задания полностью, если процесс выполняется на переднем плане, таким образом, & используется для запущения программы в фоновом режиме, где это может счастливо остаться рабочим с, или без пользователя вошел в систему.

26
ответ дан 07.12.2019, 09:15

В дополнение к ответу @Martin: другое использование амперсанда (>& как выше), должен получить обоих stdout и stderr. Обычно при перенаправлении вывода в файл с только'>', Вы только получили бы вывод к stdout, пропавшие без вести любых ошибок.

13
ответ дан 07.12.2019, 09:15

В дополнение к Martin и ответу Ash, иногда можно видеть использование && маркер. Это используется для высказывания "выполненный вторая команда, если и только если первая команда работала успешно". Правильно написанная команда будет, если она будет иметь какие-либо ошибки, не выходят успешно.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
4
ответ дан 07.12.2019, 09:15

Ответ Martin хорош, но немного неоднозначен. Команда всегда fork'ed и exec'ed, но нормальное поведение оболочки состоит в том, чтобы ожидать на команде, пока это не выходит. Амперсанд помещает его в фон так, чтобы Вы вернули свою терминальную подсказку, и можно сделать другие вещи. Если процесс выложит данные к stdout или stderr, то это будет смешано с тем, что Вы делаете при подсказке и можете смутить Вас. Поэтому Вы перенаправляете затем с> и /path/to/logfile.txt.

В ответ на George2 состоит в том, чтобы отправить нормальное поведение для выхода оболочки, сигнал SIGHUP ко всем процессам в той же группе процесса (по существу наполняют Вас порожденный), и они обычно будут завершать. Если Вы хотите, чтобы это продолжилось, даже при закрытии процесса оболочки можно использовать команду nohup, чтобы заставить их проигнорировать этот сигнал и продолжать бежать. Существует специальное название этого типа процесса, это назвало процесс демона (объявленным 'демоном').

2
ответ дан 07.12.2019, 09:15

Теги

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