Was bedeutet kaufmännisches Und am Ende einer Shell-Skriptzeile?


118
sh sys-snap.sh &

Was ist sh? Was ist sys-snap.sh? Warum sollte ich &am Ende der Zeile setzen? Kann mir jemand die Syntax erklären?

Ohne das wird &das Skript nicht zur Eingabeaufforderung zurückkehren, bis ich Ctrl+ drücke C. Mit &kann ich enter drücken und es funktioniert.


2
unterscheidet sich das doppelte kaufmännische und &&von einem einzelnen kaufmännischen und &?
Charlie Parker

1
@CharlieParker Hast du jemals eine Antwort darauf gefunden? Ich versuche, den Unterschied selbst herauszufinden. (Edit: Nevermind, fand es weiter unten)
Drazen Bjelovuk

Antworten:


94

shist die Standard- Bourne-kompatible Shell (normalerweise bash oder dash)

sys-snap.shist ein Shell-Skript, das Befehle enthält, die shausgeführt werden. Da Sie seinen Inhalt nicht posten, kann ich nur anhand seines Namens erraten, was er tut. Ich kann ein mit CPanel verwandtes Skript mit demselben Dateinamen finden, das eine Protokolldatei mit allen aktuellen Prozessen, der aktuellen Speichernutzung, dem Datenbankstatus usw. erstellt. Wenn das Skript mit einer Shebang-Zeile ( #!/bin/shoder ähnlichem) beginnt , können Sie es ausführbar machen mit chmod +x sys-snap.shund starten Sie es direkt mit, ./sys-snap.shwenn es sich im aktuellen Verzeichnis befindet.

Wenn &der Prozess im Hintergrund gestartet wird, können Sie die Shell weiterhin verwenden und müssen nicht warten, bis das Skript beendet ist. Wenn Sie es vergessen haben, können Sie den laufenden Prozess mit stoppen Ctrl-Zund im Hintergrund mit bg(oder im Vordergrund mit fg) fortsetzen. Weitere Informationen finden Sie unter Jobsteuerung


4
shin der Regel nur bashoder dashin Linux-basierten Systemen (oder neueren OS / X). Auf BSDs ist es normalerweise eine andere Variante von Ash (Dash basiert auf NetBSD sh, selbst basiert auf der Almquist Shell) oder ein pdksh-Derivat. Bei kommerziellen Unices ist es im Allgemeinen ksh88.
Stéphane Chazelas

1
@jofel: Was ist, wenn das folgende Skript ausgeführt wird und ich versehentlich Strg-C ausgeführt habe? Wird mein Skript ausgeführt oder wird es beendet? Beispiel: sh sys-snap.sh &
Hussain7

2
@ Hussain7 Strg-C wird immer an den aktuellen Prozess im Vordergrund gesendet. Wenn das Shell-Skript mit &und damit im Hintergrund gestartet wird , erhalten Sie nur eine neue Shell-Eingabeaufforderung.
Jofel

2
unterscheidet sich das doppelte kaufmännische und &&von einem einzelnen kaufmännischen und &?
Charlie Parker

7
@CharlieParker Ja, "&&" ist die "und" Funktion. Der Befehl nach && wird nur aufgerufen, wenn der Befehl zuvor erfolgreich war. Beispiel "true
&

87

Dies ist job controlunter Unix bekannt. Das &weist die Shell an, den Befehl in den Hintergrund zu stellen. Dies bedeutet, dass der sys-snap.shBefehl weiterhin ausgeführt wird , Sie jedoch zu Ihrer Shell zurückkehren, damit Sie weiterhin parallele Befehle ausführen können.

Sie können die Liste der Jobs anzeigen, die derzeit mit dem jobsBefehl ausgeführt werden. Sie können mit dem Befehl zum Befehl zurückkehren (in den Vordergrund bringen) fg. Welche zieht den Befehl zurück in den Zustand , in dem Sie keine Aufforderung angezeigt , und Sie haben zu erteilen Ctrl- Czu töten den Prozess. Sie können diesen Vorgang jedoch unterbrechen (anhalten), indem Sie Ctrl- ausgeben Z. Dies hält an und bringt sys-snap.shSie zu Ihrer Eingabeaufforderung zurück. Anschließend können Sie Hintergrund es (als ob Sie sie ausgestellt hatte mit der &) mit dem bgBefehl, und es wird resume von ihm ausgeführt ist , den Zustand pausiert Ctrl- Zhatte steckte es in.

Beachten Sie, dass Sie mehrere Jobs gleichzeitig ausführen können (siehe Abbildung jobs):

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

Sie können sie mit ihrer Auftragsnummer im Hintergrund und im Vordergrund anzeigen, %1werden sys-snap.shund %2werden another-script.sh. Wenn Sie fgoder bgohne Argumente verwenden, wird der Befehl für den +in der jobsobigen Ausgabe gekennzeichneten Job ausgeführt .

fg %1

wird sys-snap.shwieder in den Vordergrund gestellt, während another-script.shim Hintergrund verlassen.

Sie können die Ctrl- CSequenz ausgeben , um Jobs auszuführen, ohne sie mit dem killBefehl in den Vordergrund zu stellen . kill %1Sendet das Äquivalent von Ctrl- Can sys-snap.sh.

Wenn Sie die Bash-Shell verwenden, enthält der man bashBefehl einen detaillierten Abschnitt unter der Überschrift "JOB-KONTROLLE", der ausführlicher beschrieben wird.

In Bezug auf den Namen sys-snap.sh, unter Unix - Dateinamen beliebig (mit ein paar Ausnahmen wie Dynamic Loader - Dateien). Es ist nicht erforderlich, dass sie über bestimmte Dateierweiterungen verfügen, damit sie als Shell-Skript ausgeführt, andere Befehle wie perloder phpusw. aufgerufen werden. In diesem Fall handelt es sich in der Regel um .shein Shell-Skript, das die Bourne-Shell verwendet /bin/sh.

Der funktionale Teil von sys-snap.sh(wenn Sie sich den Inhalt mit etwas wie dem lessBefehl ansehen ) ist der Shebang . In der ersten Zeile finden Sie wahrscheinlich eines von:

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

oder ähnliches. Grundsätzlich wird der Befehl nach dem #!(wie /bin/sh) ausgeführt, und der Inhalt der restlichen Skriptdatei wird zeilenweise eingespeist. Beachten Sie, dass die Datei auch ausführbar sein muss, chmoddamit Sie sie als Befehl ausführen können. Wenn die Berechtigungen nicht festgelegt wurden, shebanghat das keine Auswirkung, da Sie entweder den Fehler erhalten würden:

bash: sys-snap.sh: command not found

oder wenn Sie es über einen expliziten Pfad ./sys-snap.sh( .dh das aktuelle Arbeitsverzeichnis) ausführen, erhalten Sie:

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

Die andere Alternative ist, es ohne Ausführungsberechtigungen zu belassen und explizit / bin / sh aufzufordern, es auszuführen:

/bin/sh sys-snap.sh &

3
Das ist eine großartige Antwort. Ein möglicher Vorschlag besteht darin, auch die Aufgaben zu ergänzen nohup, da diese häufig in Verbindung mit &dem Starten eines Prozesses verwendet werden und in der Lage sind, die Shell zu beenden, die ihn gestartet hat, ohne den Prozess zu beenden.
Tommy

@ Drav, ist es wahr, dass jobsimmer leer zurückgegeben wird, wenn es der erste Befehl ist?
Pacerier

Beachten Sie, dass die Verwendung von &am Ende eines Befehls nur das Trennen stdin(aber nicht stdoutoder stderr) impliziert, wenn Ihr Befehl / Skript im Hintergrund ausgeführt wird, aber in das geschrieben wird. Dies stdoutkann zu einer Situation führen, in der Ctrl + cdie Ausgabe nicht gestoppt wird, Sie jedoch in der Lage sind Befehle eingeben. Dies liegt daran, dass in den Hintergrundprozess geschrieben wird, dieser stdoutjedoch nicht angehalten werden kann, da er nicht im Vordergrund ausgeführt wird. Mehr Infos hier .
Vadasambar

4

shist eine Muschel. Welche Shell genau hängt vom System ab. Beispiel für ein System, das bashals Standardshell verwendet wird:

$ 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.shwird ein Shell-Skript sein, also sh sys-snap.shwird das Shell-Skript ausgeführt.

&führt dazu, dass der Shell-Prozess im Hintergrund ausgeführt wird. Ohne &bleibt es im Vordergrund, bis das Skript endet. Das Skript funktioniert so oder so, es muss nur gewartet werden, bis das Skript beendet ist oder nicht, bevor weitere Befehle ausgeführt werden.


1

Befindet sich Ihr Server im Hostgator?

Das Skript sys-snap.shist ein spezielles Skript, das vom Hostgator-Team geschrieben wurde, um alle Protokolldateien und Daten für das System zu erfassen, damit diese die Systeminformationen anhand ihrer Ausgabe überwachen und erfassen können.


Nein, ich benutze keinen Hostgator.
user4951

1
@ J.Chang Das Skript ist Teil von cPanel, das Hostgator und Hunderte anderer Hosts verwenden.
472084

@ 472084, Welche cpanel-Version?
Pacerier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.