В дополнение к ответам Мартина, Эша и Кевина, иногда вы увидите амперсанд, используемый математически для побитового И * :
$ echo $(( 11 & 7 ))
3
Если вы не знакомы с битовыми операторами:
11: 1011
7: 0111
-------- AND
3: 0011
В каждой позиции есть один бит в первом числе и второе число, установите этот бит в единицу в ответе.
* Функция в ответе Кевина называется логическим AND.
Чтобы уточнить ответ Эша, при использовании перенаправления амперсанд может указать оболочке скопировать дескриптор файла. В этой команде echo "hello" > outputfile 2>&1
амперсанд заставляет любой вывод, который может идти в стандартную ошибку (stderr, дескриптор файла 2), идти в то же место, что и стандартный вывод (stdout, дескриптор файла 1, по умолчанию для левой части >
). >& outputfile
Оператор обсчитывать для > outputfile 2>&1
.
Кроме того , новый в Bash 4, есть два новые терминаторов для положений в case
команде ;&
и ;;&
которые влияют на «проваливается» ли дело , и если да, выполняется ли следующее испытание.
Приостановлено до дальнейшего уведомления.
источник
>& filename
выводит stdout и stderr в один и тот же файл. Если вы хотите перенаправить только stderr (и оставить stdout в покое), вы должны это сделать2> filename
. Что касается вашего другого вопроса, скорее всего, вы бы использовали обаnohup
и&
.logout
илиexit
.В сценарии оболочки Bash амперсанд «&» используется для разветвления процессов:
Это приведет к тому, что команда find будет разветвлена и запущена в фоновом режиме (вы всегда можете убить ее по ее PID).
источник
Для немедленного получения вашего приглашения и запуска процесса в фоновом режиме.
nohup позволяет фоновому процессу продолжать работу даже после выхода пользователя из системы (или выхода из инициирующей оболочки).
> & перенаправляет как стандартный вывод, так и стандартную ошибку в файл журнала.
& запускает все это в фоновом режиме, давая вам ваш ответ немедленно.
Объяснение:
Каждый процесс Linux открывает три канала ввода-вывода, вход «stdin», стандартный вывод «stdout» и стандартный вывод ошибок «stderr». Их можно использовать для двоичного кода, но они традиционно являются текстовыми. Когда большинство программ видит stdin close, они закрываются (это может изменить программист).
Когда родительская оболочка завершается, stdin закрывается для дочерних элементов, и (часто обычно) дочерние элементы также выходят. Кроме того, дети получают программный сигнал SIGHUP, указывающий, что пользователь "завис" (ранее модем), и по умолчанию здесь также происходит выход. (Обратите внимание, программист может изменить все это при написании программы).
Итак, что делает nohup, так это предоставляет дочернему процессу отдельную среду ввода-вывода, связывая входы и выходы с чем-то, не привязанным к родительской оболочке, и защищая дочерний процесс от сигнала SIGHUP. Как только пользователь отключится, вы увидите фоновый процесс nohup, принадлежащий init (процесс 1), а не оболочка пользователя.
Однако
nohup
не может выполнить работу полностью, если процесс выполняется на переднем плане, поэтому&
используется для запуска программы в фоновом режиме, где она может успешно работать с или без входа в систему пользователя.источник
В дополнение к ответу @ Martin: Другое использование амперсанда (
>&
как указано выше) заключается в захвате обоихstdout
иstderr
. Обычно, если вы перенаправили вывод в файл только с «>», вы получите только выводstdout
, пропустив все ошибки.источник
В дополнение к ответу Мартина и Эша, иногда вы можете увидеть использование
&&
токена. Это используется, чтобы сказать «выполнить вторую команду тогда и только тогда, когда первая команда была выполнена успешно». Хорошо написанная команда, если она имеет какие-либо ошибки, не завершится успешно.источник
Ответ Мартина хороший, но немного двусмысленный. Команда всегда форк-и исполняется, но нормальным поведением оболочки является ожидание команды до ее выхода. Амперсанд помещает его в фоновый режим, чтобы вы вернули подсказку своему терминалу и могли делать другие вещи. Если процесс выплескивает данные в stdout или stderr, это будет смешано с тем, что вы делаете в приглашении, и может сбить вас с толку. Вот почему вы перенаправляете затем с помощью> & /path/to/logfile.txt.
В ответ на George2 нормальным поведением для выхода из оболочки является отправка сигнала SIGHUP всем процессам в одной и той же группе процессов (в основном вещи, которые вы породили), и они обычно завершаются. Если вы хотите, чтобы это продолжалось, даже если вы закрываете процесс оболочки, вы можете использовать команду nohup, чтобы они игнорировали этот сигнал и продолжали работать. Для этого типа процесса есть специальное имя, которое называется процессом демона (произносится как «демон»).
источник