Linux амперсанд в конце команды
Обновлено: 21.11.2024
точка с запятой(;)
Вы можете поместить две или более команд в одну строку, разделив их точкой с запятой (;). Оболочка будет сканировать строку, пока не достигнет точки с запятой. Все аргументы до этой точки с запятой будут считаться отдельной командой от всех аргументов после точки с запятой. Обе серии будут выполняться последовательно, при этом оболочка будет ожидать завершения каждой команды перед запуском следующей.
амперсанд (&)
Если строка заканчивается амперсандом &, оболочка не будет ждать завершения команды. Вы получите обратно приглашение оболочки, и команда будет выполнена в фоновом режиме. Вы получите сообщение, когда эта команда завершит выполнение в фоновом режиме.
Техническое объяснение того, что происходит в этом случае, объясняется в главе о процессах.
Доллар вопросительный знак ($?)
Код выхода предыдущей команды хранится в переменной оболочки $?. На самом деле $? является параметром оболочки, а не переменной, поскольку вы не можете присвоить значение переменной $?.
двойной амперсанд (&&)
Оболочка интерпретирует && как логическое И. При использовании && вторая команда выполняется только в случае успеха первой (возвращает нулевой статус выхода).
Следующий пример (логический принцип И) начинается с рабочего cd, за которым следует ls, затем нерабочий cd, за которым не следует ls.
двойная вертикальная черта (||)
|| представляет логическое ИЛИ. Вторая команда выполняется только в случае сбоя первой команды (возвращает ненулевой статус выхода).
Вот еще один пример того же принципа логического ИЛИ.
объединение (&&) и (||)
Вы можете использовать это логическое И и логическое ИЛИ, чтобы написать структуру if-then-else в командной строке. В этом примере эхо используется для отображения успешности выполнения команды rm.
экранирование специальных символов (\)
Символ обратной косой черты \ позволяет использовать управляющие символы, но без их интерпретации оболочкой это называется экранированием символов.
обратная косая черта в конце строки
Строки, заканчивающиеся обратной косой чертой, продолжаются на следующей строке. Оболочка не интерпретирует символ новой строки и будет ожидать расширения оболочки и выполнения командной строки до тех пор, пока не встретится новая строка без обратной косой черты.
еще один пример обратной косой черты в конце строки
Упражнение и решение:
<р>1. Когда вы вводите passwd, какой файл выполняется? <р>2. Что это за файл?Код:
<р>3. Дважды выполните команду pwd. (помните 0.)Код:
<р>4. Выполните команду ls после команды cd /etc, но только если команда cd /etc не привела к ошибке.Код:
<р>5. Выполните cd /etc после команды cd etc, но только если cd etc не работает.Код:
<р>6. Выполните команду sleep 7, что делает эта команда? <р>7. Выполните команду sleep 500 в фоновом режиме. <р>8. Напишите командную строку, которая выполняет rm abcd. Ваша командная строка должна вывести «успешно», если abcd удален, и «сбой», если возникла проблема.Что такое ш? Что такое sys-snap.sh? Почему я должен поставить & в конце строки? Кто-нибудь может объяснить синтаксис?
Без & скрипт не вернется к подсказке, пока я не нажму Ctrl + C . С & я могу нажать ввод, и это работает.
@CharlieParker Вы когда-нибудь находили ответ на этот вопрос? Я сам пытаюсь понять разницу. (Edit: Nevermind, нашел это ниже)
Да, они совершенно разные. A && B означает «выполнить команду B, если команда A выполнена успешно», а A || B означает «выполнить команду B, если команда A не удалась». Примеры: 'cd tmp && ls' запустит ls, только если папка tmp существует. Или в скрипте: 'cd foobar || exit 10' остановит выполнение (выход), если папка foobar не существует.
4 ответа 4
sh — это Bourne-совместимая оболочка по умолчанию (обычно bash или dash)
С помощью & процесс запускается в фоновом режиме, поэтому вы можете продолжать использовать оболочку и не ждать завершения работы скрипта. Если вы забудете об этом, вы можете остановить текущий запущенный процесс с помощью Ctrl-Z и продолжить его в фоновом режиме с помощью bg (или на переднем плане с помощью fg ). Дополнительную информацию см. в разделе Управление заданиями
sh обычно используется только в bash или dash в системах на базе Linux (или последних версиях OS/X). В BSD это обычно другой вариант Ash (dash основан на NetBSD sh, а сам основан на Almquist Shell) или производном от pdksh. В коммерческих Unix это обычно ksh88.
@jofel: Что делать, если приведенный ниже скрипт запущен, и я по ошибке нажал Ctrl-C. Выполнится ли мой скрипт или он будет завершен? Пример: sh sys-snap.sh &
@Hussain7 Ctrl-C всегда отправляется текущему процессу на переднем плане. Если сценарий оболочки запущен с помощью & и, следовательно, в фоновом режиме, вы получите только новое приглашение оболочки.
@CharlieParker Да, "&&" - это функция "и". Команда после && вызывается только тогда, когда предыдущая команда завершается успешно.Пример "true && echo работает" output "работает, но "false && echo no output" не вызывает функцию echo.
В Unix это называется управлением заданиями. & информирует оболочку о переводе команды в фоновый режим. Это означает, что он продолжает выполнять команду sys-snap.sh, но возвращает вас в вашу оболочку, чтобы вы могли продолжать выполнять параллельные команды.
Вы можете просмотреть список заданий, запущенных в данный момент, с помощью команды jobs. Вы можете вернуться к команде (перевести на передний план) с помощью команды fg. Что возвращает команду в состояние, когда вы не видите приглашения, и вам нужно нажать Ctrl - C, чтобы убить процесс. Однако вы можете приостановить (приостановить) этот процесс, выполнив Ctrl - Z . Это приостановит работу sys-snap.sh и вернет вас к подсказке. Затем вы можете запустить его в фоновом режиме (как если бы вы ввели его с помощью & ) с помощью команды bg, и он возобновит работу из состояния паузы, которое было поставлено Ctrl - Z это внутри.
Обратите внимание, что у вас может быть более одной работы одновременно (как показано вакансиями):
Вы можете фонировать и активировать их, используя их номер задания, %1 будет sys-snap.sh, а %2 будет другим-script.sh . Если вы используете fg или bg без аргументов, это будет выполнять команду для задания, отмеченного + в выходных данных заданий выше.
вернут sys-snap.sh на передний план, а другой script.sh останется на заднем плане.
Вы можете выполнить последовательность Ctrl - C для запущенных заданий, не переводя их на передний план с помощью команды kill, kill %1 отправит эквивалент Ctrl - C в sys-snap.sh .
Если вы используете оболочку bash, команда man bash содержит подробный раздел под заголовком «УПРАВЛЕНИЕ ЗАДАНИЯМИ», в котором содержится более подробная информация.
Что касается имени sys-snap.sh , в unix имена файлов произвольны (за некоторыми исключениями, такими как файлы динамического загрузчика). Для них не требуется иметь определенные расширения файлов, чтобы они запускались как сценарий оболочки, вызывали другие команды, такие как perl или php и т. д. Обычно это используется для обеспечения ясности, что в данном случае это .sh сценарий оболочки. с помощью Bourne Shell /bin/sh .
Функциональной частью sys-snap.sh (если посмотреть на его содержимое с помощью чего-то вроде команды less) является Shebang. В первой строке вы, вероятно, найдете одно из:
или если вы запустите его по явному пути ./sys-snap.sh ( . означает текущий рабочий каталог), вы получите:
Другой вариант — оставить его без прав на выполнение и явно попросить /bin/sh запустить его:
Оператор & в конце команды используется для перевода команд в фоновый режим. На самом деле это стандартный синтаксис, определенный стандартом POSIX:
Асинхронные списки
Если команда завершается управляющим оператором ( '&' ), оболочка должна выполнять команду асинхронно в подоболочке. Это означает, что оболочка не должна ждать завершения команды перед выполнением следующей команды.
Формат для запуска команды в фоновом режиме:
command1 & [command2 & . ]
Целью фоновых команд является запуск команды без основной оболочки в сценарии или интерактивной оболочке, ожидающей команды, что заблокирует выполнение других команд и создаст неудобства для пользователя в ожидании. Это удобно для запуска длительных команд, но вам нужно продолжить работу в текущей оболочке. Как вы можете догадаться, это произошло во времена, когда не было эмуляторов терминалов с несколькими вкладками, а терминалы представляли собой реальное физическое оборудование, подключенное к самому компьютеру.
Из определения видно, что & также служит терминатором команд для списков команд, подобно ; делает. В вашем конкретном примере pyprogramm >> /dev/null 2>&1 и в списке есть только одна команда.
Последовательный ; списки против асинхронных и списков
являются двумя примерами списков, оканчивающихся символом ; и операторы &. Одно из отличий состоит в том, что в списке & Terminated list вход будет связан с /dev/null, если управление заданиями отключено:
Если управление заданиями отключено (см. set, -m), стандартный ввод для асинхронного списка до того, как будут выполнены какие-либо явные перенаправления, будет считаться назначенным файлу, который имеет те же свойства, что и / Дев/ноль. Этого не должно происходить, если включено управление заданиями. Во всех случаях явное перенаправление стандартного ввода отменяет это действие.
Однако в последовательном списке каждая команда по-прежнему имеет стандартный ввод, подключенный к терминалу, если нет явных перенаправлений.
Также обратите внимание, что из определения, которое мы упоминали ранее, & выполняет команды в подоболочке. Напротив, ; завершенный список выполняется в текущей оболочке. Также есть разница в статусах выхода. Для & стандарт говорит:
Статус выхода асинхронного списка должен быть равен нулю.
Это важно, если вы хотите перевести несколько команд в фоновый режим. Когда вы пишете сценарий или команду, вам нужно будет выбрать команды, для которых вам все равно, не удалось их выполнить или нет, или вам придется найти способ обработки ненулевого (ошибка) статуса выхода. В вашем конкретном примере pyprogramm >> /dev/null 2>&1 & работающий в фоновом режиме должен иметь какой-то способ указать, произошел ли сбой или нет, однако, судя по тому, что вы используете 2>&1, вы скрываете вывод ошибки путем перенаправления, и вы, вероятно, предположим, что скрипт не должен дать сбой.
Напротив, ; статус выхода определяется как:
Статус выхода последовательного списка должен быть статусом выхода последней команды в списке.
Опять же, это влияет на то, как вы пишете последовательный список команд в командной строке и как вы хотите, чтобы что-то обрабатывалось, если некоторые из команд в списке завершились неудачей.
Примечания и дополнительное чтение
Тот факт, что это определение POSIX, означает, что все оболочки типа Bourne, то есть bash , dash и ksh , должны его поддерживать.
& в перенаправлении отличается от & в качестве терминатора команды. Имеется в виду дублирование (копирование) объекта файлового дескриптора. См. Что означает & точно в перенаправлении вывода?
В bash также есть оператор |& (обратите внимание, что между вертикальной чертой и амперсандом нет пробела). Из руководства bash:
Если используется |&, стандартная ошибка команды, в дополнение к ее стандартному выводу, соединяется со стандартным вводом команды2 через канал; это сокращение от 2>&1 |. Это неявное перенаправление стандартной ошибки на стандартный вывод выполняется после любых перенаправлений, указанных командой.
Взгляните на инструменты, описанные в трех предыдущих статьях, и вы увидите, что понимание того связующего звена, которое их объединяет, так же важно, как и распознавание самих инструментов. Действительно, инструменты, как правило, просты, и понимание того, что делают mkdir, touch и find (создание нового каталога, обновление файла и найти файл в дереве каталогов соответственно) по отдельности несложно.
Но понять, что
делает, а зачем писать такую командную строку — это совсем другая история.
Стоит присмотреться к знакам и символам, расположенным между командами. Это не только поможет вам лучше понять, как все работает, но и научит вас объединять команды в цепочки для создания составных инструкций, которые помогут вам работать более эффективно.
В этой и следующей статьях мы рассмотрим амперсанд ( & ) и его близкого друга, вертикальную черту ( | ), и посмотрим, как они могут означать разные вещи в разных контекстах.
За кулисами
Давайте начнем с простого и посмотрим, как можно использовать & для перевода команды в фоновый режим. Инструкция:
Копирует все файлы и подкаталоги из original/dir/ в backup/dir/. Пока так просто. Но если это окажется большим объемом данных, это может занять ваш терминал на несколько часов.
переводит процесс на задний план благодаря финальному & . Это освобождает вас для продолжения работы на том же терминале или даже для закрытия терминала, чтобы процесс завершился. Обратите внимание, однако, что если процесс попросят вывести что-то на стандартный вывод (как в случае с echo или ls ), он продолжит это делать, даже если он выполняется в фоновом режиме.
Когда вы переводите процесс в фоновый режим, Bash распечатывает число. Это число представляет собой PID или идентификатор процесса. Каждый процесс, работающий в вашей системе Linux, имеет уникальный идентификатор процесса, и вы можете использовать этот идентификатор для приостановки, возобновления и завершения процесса, на который он ссылается. Это пригодится позже.
Тем временем есть несколько инструментов, которые вы можете использовать для управления своими процессами, оставаясь в терминале, с которого вы их запустили:
jobs показывает вам процессы, запущенные в вашем текущем терминале, будь то в фоновом или переднем плане. Он также показывает номер, связанный с каждым заданием (отличный от PID), который вы можете использовать для ссылки на каждый процесс:
fg выводит задание из фона на передний план, чтобы вы могли взаимодействовать с ним. Вы сообщаете fg, какой процесс вы хотите вывести на передний план, с помощью символа процента ( % ), за которым следует число, связанное с заданием, которое вам дали задания:
Если задание было остановлено (см. ниже), fg запустит его снова.
Вы можете остановить задание на переднем плане, удерживая клавишу [Ctrl] и нажимая [Z]. Это не прерывает действие, оно приостанавливает его. Когда вы снова запустите его с помощью ( fg или bg ), он продолжится с того места, где остановился…
… За исключением режима сна: время приостановки задания в режиме сна по-прежнему считается после возобновления режима сна. Это связано с тем, что сон принимает к сведению время на часах, когда он был запущен, а не то, как долго он работал. Это означает, что если вы запустите sleep 30 и приостановите его более чем на 30 секунд, как только вы возобновите работу, sleep немедленно прекратит работу.
Как упоминалось выше, вы не сможете использовать ни одну из этих команд, если закроете терминал, с которого запустили процесс, или перейдете на другой терминал, даже если процесс продолжит работу.
Для управления фоновыми процессами с другого терминала вам понадобится другой набор инструментов. Например, вы можете остановить процесс с другого терминала с помощью команды kill:
И вы знаете PID, потому что это число, которое Bash дал вам, когда вы начали процесс с & , помните? Ой! Вы не записали? Без проблем. Вы можете получить PID любого запущенного процесса с помощью команды ps (сокращение от processes). Итак, используя
покажет вам все процессы, содержащие строку «cp», включая задание копирования, которое мы используем для нашего примера. Он также покажет вам PID:
В этом случае PID равен 14444. и это означает, что вы можете остановить фоновое копирование с помощью:
Обратите внимание, что STOP здесь делает то же самое, что и [Ctrl] + [Z] выше, то есть приостанавливает выполнение процесса.
Чтобы снова запустить приостановленный процесс, вы можете использовать сигнал CONT:
Здесь есть хороший список многих основных сигналов, которые вы можете отправить процессу. В соответствии с этим, если вы хотите завершить процесс, а не просто приостановить его, вы можете сделать это:
Если процесс отказывается завершаться, вы можете принудительно выполнить его с помощью:
Это немного опасно, но очень полезно, если процесс сошел с ума и поглощает все ваши ресурсы.
В любом случае, если вы не уверены, что у вас правильный PID, добавьте параметр x к ps :
И вы должны увидеть, какой процесс вам нужен.
Наконец, есть отличный инструмент, который объединяет ps и grep в одно:
Выводит список всех PID процессов, содержащих строку «cp».
В данном случае это не очень полезно, но это…
В этом случае -l указывает pgrep показать вам имя процесса, а -x сообщает pgrep, что вам нужно точное совпадение имени команды. Если вам нужны еще подробности, попробуйте pgrep -ax command .
В следующий раз
Символ & в конце команд помог нам объяснить довольно полезную концепцию процессов, работающих в фоновом и активном режиме, и способы управления ими.
И последнее, прежде чем мы уйдем: процессы, работающие в фоновом режиме, известны как демоны на языке UNIX/Linux. Так что, если вы уже слышали этот термин раньше и задавались вопросом, что это такое, вот вам.
Как обычно, есть и другие способы использования амперсанда в командной строке, многие из которых не имеют ничего общего с переводом процессов в фоновый режим. Чтобы узнать, как они используются, мы вернемся на следующей неделе с дополнительной информацией по этому вопросу.
Читайте также: