die Verwendung von </ dev / null & in der Befehlszeile

12

Ich habe versucht, ein Beispiel-Java-Programm über die folgende Befehlszeile auszuführen. Ich weiß jedoch nicht, wofür der nachfolgende Teil < /dev/null &verwendet wird.

java   -cp  /home/weka.jar weka.classifiers.trees.J48 t train_file  >& log < /dev/null &
user297850
quelle

Antworten:

21

< /dev/nullwird verwendet, um EOF sofort an das Programm zu senden, damit es nicht auf Eingaben wartet ( /dev/nulldas Nullgerät ist eine spezielle Datei, die alle darauf geschriebenen Daten verwirft, aber meldet, dass der Schreibvorgang erfolgreich war, und keine Daten an das Programm liefert jeder Prozess, der daraus liest und sofort EOF ergibt). &ist eine spezielle Art von Befehlstrennzeichen, die zum Hintergrund des vorhergehenden Prozesses verwendet wird.

Ohne das aufgerufene Programm zu kennen, weiß ich nicht direkt, warum es erforderlich ist, es auf diese Weise auszuführen.

Chris Down
quelle
6

</dev/nullTrennt den Programmeingang vom Terminal. Einige Programme reagieren unterschiedlich, je nachdem, an was ihr Standardeingang angeschlossen ist. Mit der Umleitung </dev/nullkann das Programm erkennen, dass seine Eingabe nicht von einem Terminal stammt, und erhält sofort eine Anzeige für das Dateiende, wenn es versucht, von seiner Standardeingabe zu lesen.

Das einsame &am Ende bewirkt, dass das Programm im Hintergrund ausgeführt wird. Dies bedeutet, dass Sie sofort eine Shell-Eingabeaufforderung zurückerhalten. Ohne das &würden Sie eine Shell-Eingabeaufforderung erst zurückerhalten, wenn das Programm die Ausführung beendet hat.

Beachten Sie, dass das Standalone &keine Beziehung zu hat >&. >&ist ein Umleitungsoperator (in tcsh, bash und zsh), der sowohl die Standardausgabe des Programms als auch den Standardfehler des Programms auf den nach dem Operator angegebenen Dateinamen umleitet (hier log).

Mit anderen Worten, was die Shell tut, wenn sie diese Befehlszeile sieht, ist:

  • Starten Sie einen Prozess im Hintergrund. Im Hintergrundprozess:
    • Verbinden Sie den Standardeingang mit /dev/null(dem Nullgerät ).
    • Verbinden Sie sowohl die Standardausgabe als auch den Standardfehler mit der aufgerufenen Datei log(Erstellen der Datei, falls noch nicht vorhanden, und Abschneiden, falls vorhanden).
    • Suchen Sie nach einer ausführbaren Datei, die javain der aufgerufen wird $PATH.
    • Führen Sie die Datei mit den 5 Argumente -cp, /home/weka.jar, weka.classifiers.trees.J48, –t, train_file`.
Gilles 'SO - hör auf böse zu sein'
quelle