Linux etwas anderes Verhalten Wenn wir '&' vor der Umleitung '>' und nach der Umleitung angeben

421
Gaurav Fotedar

Ich habe jboss vor kurzem im Hintergrund in Linux gestartet und habe folgendes gesehen, wenn Sie den Befehl wie folgt ausführen:

nohup ./startjboss.sh > server.log & 

Ausgabe ist:

[1] 18835 [root@cnt5-01b downloads]# 

Das Terminal für den nächsten Befehl wird direkt angezeigt.

Wenn ich den Befehl jedoch wie folgt ausführen:

nohup ./startjboss.sh & > server.log 

Dann ist die Ausgabe:

[1] 19223 [root@cnt5-01b downloads]# nohup: appending output to `nohup.out' 

Wenn ich dann die Eingabetaste drücke, wird Folgendes angezeigt:

[root@cnt5-01b downloads]# 

Dies ist das Terminal, an dem ich den nächsten Befehl schreiben kann.

Warum gibt es unterschiedliche Verhaltensweisen (ein zusätzliches Enter ist erforderlich)? Dies ist eine sehr kleine Sache, nicht einmal ein Problem; aber ich will nur wissen.

0

2 Antworten auf die Frage

1
user2313067

Wenn Sie das & platzieren, teilen Sie der Shell mit, dass sie vor dem Hintergrund ausgeführt wird, und fahren Sie mit einem neuen Befehl fort.

Wenn Sie es an das Ende der Zeile setzen, gibt es keinen Befehl danach, und die Shell kehrt in den interaktiven Modus zurück.

Wenn Sie es in der Mitte platzieren, interpretiert die Shell den Rest der Zeile als neuen Befehl. Dieser Befehl leitet die Standardausgabe von nichts zu server.log um. Da Sie die Ausgabe von nohup nicht umleiten, wird sie jetzt auf dem Terminal angezeigt. Da die Shell ihre PS1 bereits zuvor neu gezeichnet hat, sehen Sie diese Zeile wie einen Befehl. Sie wird jedoch einfach von einem Hintergrundjob ausgegeben. Sie können Ihren neuen Befehl eingeben, ohne vorher die Eingabetaste drücken zu müssen (auch wenn Sie ihn später lesen.)

0
MoonDrop legacy

Wenn Sie einen Befehl mit &after ausführen, verlieren Sie etwas an Funktionalität.

Nehmen Sie dies als Beispiel und erstellen Sie ein Skript, das nichts weiter tut, als zum Beispiel 2 zurückzugeben.

  • Führen Sie das Skript normal aus echo $?und geben Sie die Ausgabe ein 2.
  • Führen Sie das Skript &danach aus, echo $?und Sie sehen die Ausgabe 0.

nohup ./startjboss.sh & > server.logWenn Sie die server.logDatei überprüfen, sehen Sie bei der Ausführung, dass sie leer ist. Dies liegt daran, dass die Ausgabe des Hintergrundprozesses 0erfolgreich beendet wird. Da Sie dies jedoch nicht getan echohaben server.log, wird nichts geschrieben server.log.