Co oznacza ampersand na końcu linii skryptu powłoki?

118
sh sys-snap.sh &

Co to jest sh? Co to jest sys-snap.sh? Dlaczego powinienem umieścić &na końcu linii? Czy ktoś może wyjaśnić składnię?

Bez &skryptu nie wróci do monitu, dopóki nie naciśnie Ctrl+ C. Z &mogę nacisnąć Enter i to działa.

użytkownik4951
źródło
2
czy podwójne znaki handlowe &&różnią się od pojedynczych znaków handlowych &?
Charlie Parker,
1
@CharlieParker Czy kiedykolwiek znalazłeś odpowiedź na to pytanie? Sam próbuję zrozumieć różnicę. (Edycja: Nevermind, znalazłem to niżej)
Drazen Bjelovuk

Odpowiedzi:

94

shjest domyślną powłoką kompatybilną z Bourne (zwykle bash lub dash)

sys-snap.shto skrypt powłoki, który zawiera polecenia, które shwykonuje. Ponieważ nie publikujesz jego treści, mogę tylko zgadywać z jego nazwy, co robi. Mogę znaleźć skrypt związany z CPanel o tej samej nazwie, który tworzy plik dziennika ze wszystkimi bieżącymi procesami, bieżącym zużyciem pamięci, statusem bazy danych itp. Jeśli skrypt zaczyna się od linii shebang ( #!/bin/shlub podobnej), możesz go wykonać za pomocą chmod +x sys-snap.shi uruchom go bezpośrednio, używając, ./sys-snap.shjeśli znajduje się w bieżącym katalogu.

Dzięki &proces rozpoczyna się w tle, dzięki czemu można nadal używać powłoki i nie trzeba czekać aż skrypt zostanie zakończony. Jeśli go zapomnisz, możesz zatrzymać bieżący proces za pomocą Ctrl-Zi kontynuować w tle za pomocą bg(lub na pierwszym planie za pomocą fg). Aby uzyskać więcej informacji, zobacz Kontrola zadań

Jofel
źródło
4
shw zwykle tylko bashalbo dashw systemach opartych na Linux (lub ostatnim OS / X). W przypadku BSD jest to zwykle inny wariant Ash (dash jest oparty na NetBSD sh, sam oparty na Almquist Shell) lub pochodnej pdksh. W komercyjnych Unices jest to zazwyczaj ksh88.
Stéphane Chazelas,
1
@jofel: Co jeśli uruchomiony jest poniższy skrypt i przez pomyłkę wykonałem Ctrl-C. Czy mój skrypt zostanie wykonany, czy też zostanie zakończony? Np .: sh sys-snap.sh &
Hussain7
2
@ Hussain7 Ctrl-C jest zawsze wysyłany do bieżącego procesu na pierwszym planie. Jeśli skrypt powłoki zostanie uruchomiony, &a zatem w tle, pojawi się tylko nowy monit powłoki.
jofel
2
czy podwójne znaki handlowe &&różnią się od pojedynczych znaków handlowych &?
Charlie Parker,
7
@CharlieParker Tak, „&&” to funkcja „i”. Polecenie po && jest wywoływane tylko wtedy, gdy polecenie poprzedzające zakończy się powodzeniem. Przykład „true && echo works” output ”działa, ale„ false && echo no output ”nie wywołuje funkcji echa.
jofel
87

Jest to znane jako job controlUNIX. &Informuje powłokę, aby umieścić polecenia w tle. Oznacza to, że nadal uruchamia sys-snap.shpolecenie, ale wraca do powłoki, umożliwiając kontynuowanie wykonywania poleceń równoległych.

Możesz zobaczyć listę zadań aktualnie uruchomionych z jobspoleceniem. Możesz powrócić do polecenia (przenieść na pierwszy plan) za pomocą fgpolecenia. Który powoduje powrót polecenia do stanu, w którym nie widzisz monitu i musisz go wydać Ctrl- Caby zabić proces. Możesz jednak zawiesić (wstrzymać) ten proces, wydając Ctrl- Z. Spowoduje to wstrzymanie sys-snap.shi powrót do monitu. Można wtedy tło to (tak, jakbyś wydał go z& ) z bgpolecenia i będzie wznowić działa od jego przerwał stan ten Ctrl- Zwłożył go.

Pamiętaj, że możesz mieć więcej niż jedno zadanie na raz (jak pokazano przez jobs):

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

Możesz je w tle i na pierwszym planie, używając ich numeru zadania, %1będzie sys-snap.shi %2będzie another-script.sh. Jeśli użyjesz argumentów fglub bgbez nich, wykona polecenie dla zadania oznaczonego przez +w jobspowyższym wyniku.

fg %1

będzie można umieścić sys-snap.shz powrotem na pierwszy plan, pozostawiając another-script.shw tle.

Możesz wydać sekwencję Ctrl- Cdo uruchomionych zadań bez konieczności przedkładania ich za pomocą killpolecenia, kill %1wyśle ​​odpowiednik Ctrl- Cdo sys-snap.sh.

Jeśli używasz powłoki bash, man bashpolecenie zawiera szczegółową sekcję pod sekcją „KONTROLA ZADAŃ”, która zawiera bardziej szczegółowe informacje.

Jeśli chodzi o nazwę sys-snap.sh, pod uniksowymi nazwami plików są dowolne (z kilkoma wyjątkami, takimi jak dynamiczne pliki ładujące). Nie ma wymogu posiadania określonych rozmiarów plików, aby działały one jako skrypt powłoki, wywoływały inne polecenia, takie jak perllub phpitp. Zwykle służy do zapewnienia jasności, że w tym przypadku jest .shto skrypt powłoki korzystający z powłoki Bourne'a /bin/sh.

Funkcjonalną częścią sys-snap.sh(gdy patrzysz na jej zawartość za pomocą czegoś takiego jak lesspolecenie) jest Shebang . W pierwszym wierszu prawdopodobnie znajdziesz jeden z:

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

lub podobne. Mówiąc najprościej, polecenie po #!(np. /bin/sh) Jest uruchamiane, a zawartość reszty pliku skryptu jest podawana do niego po linii na raz. Należy pamiętać, że plik musi być również ustawiony na wykonywalny chmod, aby można go było uruchomić jako polecenie. Jeśli uprawnienia nie zostały ustawione, shebangnie ma to wpływu, ponieważ albo wystąpiłby błąd:

bash: sys-snap.sh: command not found

lub jeśli uruchomiłeś go jawną ścieżką ./sys-snap.sh( .co oznacza bieżący katalog roboczy), otrzymasz:

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

Inną alternatywą jest pozostawienie go bez wykonywania uprawnień i wyraźne poproszenie / bin / sh o uruchomienie:

/bin/sh sys-snap.sh &
Drav Sloan
źródło
3
to świetna odpowiedź. jedną z możliwych sugestii jest dodanie tego nohup, co robi, ponieważ jest często używane w połączeniu z, &aby rozpocząć proces i być w stanie zabić powłokę, która uruchomiła go bez zabijania procesu.
Tommy
@Drav, Czy to prawda, że jobsto zawsze zwróci puste, jeśli jest to pierwsze polecenie?
Pacerier,
Zauważ, że użycie &na końcu polecenia powoduje jedynie odłączenie stdin(ale nie stdoutlub stderr), co oznacza, że ​​jeśli twoje polecenie / skrypt działa w tle, ale pisze do stdout, możesz napotkać sytuację, w której Ctrl + cnie zatrzyma wyjścia, ale będziesz w stanie wpisywać polecenia. Wynika to z tego, że proces w tle pisze do, stdoutale nie można go zatrzymać, ponieważ nie działa na pierwszym planie. Więcej informacji tutaj .
vadasambar
4

shjest skorupą. Która skorupa dokładnie zależy od systemu. Przykład dla systemu, który używa bashjako standardowej powłoki:

$ 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.shbędzie pewnego rodzaju skryptem powłoki, więc sh sys-snap.shwykona skrypt powłoki.

&spowoduje uruchomienie procesu powłoki w tle. Bez &tego pozostanie na pierwszym planie, dopóki skrypt się nie skończy. Skrypt będzie działał w obu kierunkach, jest to tylko kwestia oczekiwania na zakończenie skryptu lub nie przed wykonaniem kolejnych poleceń.

frostschutz
źródło
1

Czy twój serwer jest hostgatorem?

Skrypt sys-snap.shjest specjalnym skryptem napisanym przez zespół hostgatora w celu zebrania wszystkich plików dziennika i danych dla systemu, więc wykorzystują jego dane wyjściowe do monitorowania i zbierania informacji o systemie.

tareq.t
źródło
Nie, nie używam hostgatora.
user4951,
1
@ J.Chang Skrypt jest częścią cPanel, z którego korzysta Hostgator i setki innych hostów.
472084
@ 472084, Która wersja panelu?
Pacerier,