Що означає "амперсанд" в кінці рядка сценарію оболонки?


118
sh sys-snap.sh &

Що таке sh? Що таке sys-snap.sh? Чому я повинен ставити &в кінці рядка? Хтось може пояснити синтаксис?

Без &сценарію не повернуться до підказки, поки не натисніть Ctrl+ C. За допомогою &я можу натиснути клавішу Enter, і це працює.


2
чи подвійний амперсанд &&відрізняється від одиничної амперсанд &?
Чарлі Паркер

1
@CharlieParker Ви коли-небудь знаходили відповідь на це? Я сам намагаюся з’ясувати різницю. (Редагувати: Nevermind, знайшли це далі)
Dražen 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). Для отримання додаткової інформації див. Контроль роботи


4
shяк правило, лише bashабо dashв системах на базі Linux (або останніх ОС / X). На BSD, як правило, це інший варіант Ash (тире базується на NetBSD sh, сам на основі оболонки Almquist) або похідне pdksh. У комерційних Unices це звичайно ksh88.
Стефан Шазелас

1
@jofel: Що робити, якщо нижче запущений скрипт і я помилково виконав Ctrl-C. Чи виконає мій сценарій чи його припинять? Напр .: sh sys-snap.sh &
Hussain7

2
@ Hussain7 Ctrl-C завжди надсилається поточному процесу на перший план. Якщо скрипт оболонки запускається &і, отже, у фоновому режимі, ви отримуєте лише нове запит оболонки.
jofel

2
чи подвійний амперсанд &&відрізняється від одиничної амперсанд &?
Чарлі Паркер

7
@CharlieParker Так, "&&" - це функція "і". Команда після && викликається лише тоді, коли команда перед успішною. Приклад "true && echo працює" працює "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- Cдо sys-snap.sh.

Якщо ви використовуєте bash shell, у man bashкоманді є детальний розділ під розділом «JOB CONTROL», який детальніше описується.

Що стосується імені sys-snap.sh, під unix назви файлів є довільними (за кількома винятками, як динамічні файли завантажувача). Для них немає вимоги мати специфічні розширення файлів, щоб змусити їх працювати як скрипт оболонки, викликати інші команди, такі як perlі phpт. Д. Зазвичай він використовується для забезпечення ясності, що в цьому випадку це .shсценарій оболонки за допомогою оболонки Борна /bin/sh.

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

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

або подібне. В основному, команда після #!(наприклад, /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але ви не можете зупинити його, оскільки він не працює на передньому плані. Більше інформації тут .
vadasambar

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виконуватиме сценарій оболонки.

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


1

Ваш сервер знаходиться в хостігаторі?

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


Ні, я не використовую hostgator.
user4951

1
@ J.Chang Сценарій є частиною cPanel, яку використовує Hostgator та сотні інших хостів.
472084

@ 472084, яка версія cpanel?
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.