Что означает амперсанд в конце строки сценария оболочки?

118
sh sys-snap.sh &

Что такое sh? Что такое sys-snap.sh? Почему я должен поставить &в конце строки? Кто-нибудь может объяснить синтаксис?

Без этого &скрипт не вернется к подсказке, пока я не нажму Ctrl+ C. С помощью &я могу нажать Enter, и это работает.

user4951
источник
2
отличается ли двойной амперсанд &&от одного амперсанда &?
Чарли Паркер
1
@CharlieParker Вы когда-нибудь находили ответ на это? Я пытаюсь выяснить разницу сам. (Edit: Nevermind, нашел его еще ниже)
Drazen Bjelovuk

Ответы:

94

shэто Bourne-совместимая оболочка по умолчанию (обычно bash или dash)

sys-snap.shскрипт оболочки, содержащий команды, которые shвыполняются Поскольку вы не публикуете его содержание, я могу только догадываться из его названия, что он делает. Я могу найти скрипт, связанный с CPanel, с тем же именем файла, который создает файл журнала со всеми текущими процессами, текущим использованием памяти, состоянием базы данных и т. Д. Если скрипт начинается со строки shebang ( #!/bin/shили аналогичной), вы можете сделать его исполняемым с chmod +x sys-snap.shи запустить его напрямую, используя, ./sys-snap.shесли он находится в текущем каталоге.

С &процессом запускается в фоновом режиме, так что вы можете продолжать использовать оболочку и не нужно ждать , пока сценарий не будет завершен. Если вы забудете об этом, вы можете остановить текущий запущенный процесс с помощью Ctrl-Zи продолжить его в фоновом режиме с помощью bg(или на переднем плане с помощью fg). Для получения дополнительной информации см. Контроль работы

jofel
источник
4
shобычно только bashили dashв системах на основе Linux (или в последних OS / X). На BSD это обычно другой вариант Ash (dash основан на NetBSD sh, сам по себе основанный на Almquist Shell) или производная pdksh. На коммерческих Unices это вообще ksh88.
Стефан Шазелас
1
@jofel: Что, если приведенный ниже скрипт запущен и по ошибке я выполнил Ctrl-C. Мой сценарий будет выполнен, или он будет прекращен? Пример: sh sys-snap.sh &
Hussain7
2
@ Hussain7 Ctrl-C всегда отправляется текущему процессу на переднем плане. Если shell-скрипт запускается &и, следовательно, в фоновом режиме, вы получаете только новое приглашение оболочки.
июня
2
отличается ли двойной амперсанд &&от одного амперсанда &?
Чарли Паркер
7
@CharlieParker Да, "&&" - это функция "и". Команда после && вызывается только тогда, когда команда до этого успешно выполняется. Пример «true && echo works» «output» работает, но «false && echo no output» не вызывает функцию echo.
jofel
87

Это известно как job controlпод Unix. &Информирует скорлупу поставить команду в фоновом режиме. Это означает, что он продолжает выполнять sys-snap.shкоманду, но возвращает вас в вашу оболочку, чтобы вы могли продолжать выполнять параллельные команды.

Вы можете увидеть список заданий, которые в данный момент выполняются с помощью jobsкоманды. Вы можете вернуться к команде (вывести на передний план) с помощью fgкоманды. Который тянет команду обратно в состояние, в котором вы не видите подсказки и вам нужно выдать команду Ctrl- Cчтобы убить процесс. Однако вы можете приостановить (приостановить) этот процесс, выдав Ctrl- Z. Это приостановит sys-snap.shи вернет вас к вашему приглашению. Вы можете затем фон это (как будто вы издавали его с& ) с bgкомандой, и он будет возобновить работы от его состояния паузы в Ctrl- Zпоставил его.

Обратите внимание, что вы можете иметь более одной работы одновременно (как показано jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

Вы можете фон и их передний план, используя их номер работы, %1будет sys-snap.shи %2будет another-script.sh. Если вы используете аргументы fgили bgне используете их, она будет выполнять команду для задания, помеченного +в jobsвыходных данных выше.

fg %1

поставит sys-snap.shобратно на первый план, в то время оставляя another-script.shна заднем плане.

Вы можете выполнить последовательность Ctrl- Cдля запущенных заданий без необходимости выделять их перед killкомандой с помощью команды, kill %1отправит эквивалент Ctrl- Cto sys-snap.sh.

Если вы используете оболочку bash, man bashкоманда имеет подробный раздел под разделом «УПРАВЛЕНИЕ ЗАДАНИЯМИ», в котором более подробно.

Что касается имени sys-snap.sh, в Unix имена файлов являются произвольными (с парой исключений, таких как файлы динамического загрузчика). Для них не требуется наличие определенных расширений файлов, чтобы они запускались как сценарий оболочки, вызывали другие команды, такие как perlи phpт. Д. Обычно это используется для ясности, что в данном случае это .shсценарий оболочки, использующий оболочку Борна /bin/sh,

Функциональная часть sys-snap.sh(когда вы смотрите на ее содержимое с помощью lessкоманды) - это Шебанг . В первой строке вы, вероятно, найдете одно из:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

или похожие. В общих чертах, команда a после #!(например, /bin/sh) выполняется, и содержимое остальной части файла сценария передается ей по очереди. Обратите внимание, что для файла также должен быть установлен исполняемый файл, chmodчтобы вы могли запускать его как команду. Если разрешения не были установлены, то это не shebangимеет никакого эффекта, потому что вы либо получите ошибку:

bash: sys-snap.sh: command not found

или если вы запустили его по явному пути ./sys-snap.sh( .имеется в виду текущий рабочий каталог), вы получите:

bash: ./sys-snap.sh: Permission denied

Другой вариант - оставить его без прав на выполнение и явно попросить / bin / sh запустить его:

/bin/sh sys-snap.sh &
Драв Слоан
источник
3
это отличный ответ. Одно из возможных предложений - добавить то nohup, что делает, поскольку оно часто используется вместе с тем, &чтобы запускать процесс и иметь возможность убить оболочку, которая его запустила, не убивая процесс.
Томми
@Drav, это правда, что jobsвсегда будет пустым, если это первая команда?
Pacerier
Обратите внимание, что использование &в конце команды только отсоединения stdin(но не stdoutили stderr), что подразумевает, что если ваша команда / сценарий выполняется в фоновом режиме, но выполняется запись stdout, вы можете столкнуться с ситуацией, когда Ctrl + cвы не остановите вывод, но вы сможете вводить команды. Это потому, что фоновый процесс пишет, stdoutно вы не можете остановить его, потому что он не работает на переднем плане. Больше информации здесь .
Вадасамбар
4

shэто оболочка Какая оболочка точно зависит от системы. Пример для системы, которая использует в bashкачестве стандартной оболочки:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shбудет какой-то сценарий оболочки, поэтому sh sys-snap.shвыполнит сценарий оболочки.

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

frostschutz
источник
1

Ваш сервер в hostgator?

Этот сценарий sys-snap.shпредставляет собой специальный сценарий, написанный командой hostgator для сбора всех файлов журнала и данных для системы, поэтому они используют его выходные данные для мониторинга и сбора системной информации.

tareq.t
источник
Нет, я не использую hostgator.
user4951 25.10.13
1
@ J.Chang Скрипт является частью cPanel, которую используют Hostgator и сотни других хостов.
472084
@ 472084, какая версия cpanel?
Pacerier