it-swarm.com.de

Warum einen Linux-Shell-Befehl mit '&' ausführen?

Ich verwende Red Hat Linux Enterprise Version 5. Ich habe festgestellt, dass Benutzer manchmal Befehle mit einigen &-Optionen ausführen. Im folgenden Befehl gibt es beispielsweise zwei &-Zeichen. Was ist der Zweck von ihnen? Werden sie immer zusammen mit Nohup verwendet?

Nohup foo.sh <script parameters> >& <log_file_name> &
30
George2

Zusätzlich zu den Antworten von Martin, Ash und Kevin wird manchmal ein kaufmännisches Und angezeigt, das mathematisch für ein bitweises UND verwendet wird*:

$ echo $(( 11 & 7 ))
3

Falls Sie mit Bitoperatoren nicht vertraut sind:

11: 1011
 7: 0111
-------- AND
 3: 0011

In jeder Position gibt es ein Ein-Bit in der ersten Zahl UND die zweite Zahl, setzen Sie dieses Bit in der Antwort auf Eins.

*Das Merkmal in Kevins Antwort wird als logisches UND bezeichnet.

Um die Antwort von Ash zu erläutern, kann das kaufmännische Und bei Verwendung in der Umleitung die Shell anweisen, einen Dateideskriptor zu kopieren. In diesem Befehl echo "hello" > outputfile 2>&1 bewirkt das kaufmännische Und, dass alle Ausgaben, die möglicherweise an den Standardfehler (stderr, Dateideskriptor 2) gesendet werden, an dieselbe Stelle wie die Standardausgabe (stdout, Dateideskriptor 1, Standardeinstellung für die linke Seite von >) gesendet werden. Der Operator >& outputfile ist eine Abkürzung für > outputfile 2>&1.

Neu in Bash 4 sind außerdem zwei neue Terminatoren für Klauseln in den Befehlen case, ;& und ;;&, die sich darauf auswirken, ob ein Fall "durchfällt" und, falls ja, ob der nächste Test durchgeführt wird.

15

In einem Bash Shell-Skript wird das kaufmännische Und "&" zum Verzweigen von Prozessen verwendet:

find -name hello &

Dadurch wird der Befehl find gegabelt und im Hintergrund ausgeführt (Sie können ihn jederzeit anhand seiner PID beenden).

32

Warum einen Linux-Shell-Befehl mit '&' ausführen?

So erhalten Sie Ihre Eingabeaufforderung sofort zurück und führen den Vorgang im Hintergrund aus.

Welche Funktion haben sie?

Mit Nohup kann der Hintergrundprozess fortgesetzt werden, auch nachdem sich der Benutzer abgemeldet hat (oder die initiierende Shell beendet hat).

> & leitet sowohl die Standardausgabe als auch den Standardfehler in die Protokolldatei um.

& führt das Ganze im Hintergrund aus und gibt Ihnen Ihre Eingabeaufforderung sofort zurück.

Erklärung:

Jeder Linux-Prozess öffnet drei E/A-Kanäle, einen Eingang "stdin", einen Standardausgang "stdout" und einen Standardfehlerausgang "stderr". Sie können für Binärdateien verwendet werden, sind jedoch traditionell Text. Wenn die meisten Programme stdin schließen, werden sie beendet (dies kann vom Programmierer geändert werden).

Wenn die übergeordnete Shell beendet wird, ist stdin für die untergeordneten Shell geschlossen, und (häufig, normalerweise) werden auch die untergeordneten Shell beendet. Außerdem erhalten die Kinder das Softwaresignal SIGHUP, das angibt, dass der Benutzer (früher das Modem) "aufgelegt" hat und standardmäßig auch beendet wird. (Beachten Sie, dass ein Programmierer all dies ändern kann, wenn er das Programm schreibt.).

Nohup gibt dem untergeordneten Prozess also eine separate E/A-Umgebung, die die Ein- und Ausgänge mit etwas verknüpft, das nicht mit der übergeordneten Shell verknüpft ist, und das untergeordnete Element vor dem Signal SIGHUP abschirmt. Sobald der Benutzer die Verbindung trennt, wird der Nohup-Hintergrundprozess von init (Prozess 1) angezeigt, nicht die Shell des Benutzers.

Nohup kann den Job jedoch nicht vollständig ausführen, wenn der Prozess im Vordergrund ausgeführt wird. Daher wird & verwendet, um das Programm im Hintergrund auszuführen, wo es problemlos mit oder ohne angemeldeten Benutzer ausgeführt werden kann.

26
kmarsh

Zusätzlich zu @ Martins Antwort: Die andere Verwendung von kaufmännischem Und (>& wie oben) besteht darin, sowohl stdout als auch stderr zu erfassen. Wenn Sie die Ausgabe nur mit '>' in eine Datei umleiten, wird die Ausgabe normalerweise nur in stdout ausgegeben, und es fehlen alle Fehler.

13
Ash

Zusätzlich zur Antwort von Martin und Ash wird manchmal die Verwendung eines &&-Tokens angezeigt. Dies wird verwendet, um zu sagen: "Führen Sie den zweiten Befehl genau dann aus, wenn der erste Befehl erfolgreich ausgeführt wurde." Ein gut geschriebener Befehl wird bei Fehlern nicht erfolgreich beendet.

[[email protected] ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[[email protected] ~]$ touch file
[[email protected] ~]$ ls file && echo removing file && rm file
file
removing file
[[email protected] ~]$
4
Kevin M

Martins Antwort ist gut, aber ein bisschen mehrdeutig. Der Befehl wird immer gegabelt und ausgeführt, aber das normale Shell-Verhalten besteht darin, auf den Befehl zu warten, bis er beendet wird. Das kaufmännische Und stellt es in den Hintergrund, damit Sie die Eingabeaufforderung Ihres Terminals zurückerhalten und andere Aktionen ausführen können. Wenn der Prozess Daten an stdout oder stderr ausgibt, wird dies mit dem, was Sie an der Eingabeaufforderung tun, vermischt und kann Sie verwirren. Deshalb leiten Sie dann mit> & /path/to/logfile.txt um.

Als Reaktion auf George2 besteht das normale Verhalten beim Beenden einer Shell darin, das SIGHUP-Signal an alle Prozesse in derselben Prozessgruppe zu senden (im Wesentlichen an das, was Sie erzeugt haben), und diese werden normalerweise beendet. Wenn Sie möchten, dass dies auch dann fortgesetzt wird, wenn Sie den Shell-Prozess schließen, können Sie den Befehl Nohup verwenden, damit sie dieses Signal ignorieren und weiter ausgeführt werden. Es gibt einen speziellen Namen für diesen Prozesstyp, der als Daemon-Prozess (ausgesprochen 'Dämon') bezeichnet wird.

2
Rich Homolka