użycie </ dev / null & w wierszu poleceń

12

Próbowałem uruchomić przykładowy program Java za pomocą następującego wiersza polecenia. Nie wiem jednak, do czego służy część końcowa < /dev/null &?

java   -cp  /home/weka.jar weka.classifiers.trees.J48 t train_file  >& log < /dev/null &
użytkownik297850
źródło

Odpowiedzi:

21

< /dev/nullsłuży do natychmiastowego wysyłania EOF do programu, aby nie czekał na dane wejściowe ( /dev/nullurządzenie zerowe, to specjalny plik, który odrzuca wszystkie zapisane na nim dane, ale informuje, że operacja zapisu się powiodła i nie dostarcza danych do każdy proces, który czyta z niego, natychmiast uzyskując EOF). &jest specjalnym rodzajem separatora poleceń służącym do tła poprzedniego procesu.

Nie wiedząc, że program jest wywoływany, nie wiem bezpośrednio, dlaczego należy go uruchomić w ten sposób.

Chris Down
źródło
6

</dev/nullodłącza wejście programu od terminala. Niektóre programy reagują inaczej w zależności od tego, do czego podłączone jest ich standardowe wejście. Dzięki przekierowaniu </dev/nullprogram może stwierdzić, że jego dane wejściowe nie pochodzą z terminala, i natychmiast otrzyma wskazanie końca pliku, jeśli spróbuje odczytać dane ze standardowego wejścia.

Sam &na końcu powoduje, że program jest wykonywany w tle. Oznacza to, że natychmiast otrzymasz monit powłoki. Bez tego &komunikat powłoki byłby zwracany tylko wtedy, gdy program zakończy wykonywanie.

Zauważ, że samodzielny &nie jest związany z >&. >&jest operatorem przekierowania (w tcsh, bash i zsh), który przekierowuje zarówno standardowe wyjście programu, jak i standardowy błąd programu na nazwę pliku określoną po operatorze (tutaj log).

Innymi słowy, to, co robi powłoka, gdy widzi ten wiersz poleceń, to:

  • Rozpocznij proces w tle. W tle:
    • Podłącz standardowe wejście do /dev/null( urządzenie zerowe ).
    • Podłącz standardowe wyjście i standardowy błąd do pliku o nazwie log(tworzenie pliku, jeśli jeszcze nie istnieje, i obcinanie, jeśli istnieje).
    • Poszukaj pliku wykonywalnego o nazwie javaw $PATH.
    • Wykonać ten plik z 5 argumentów -cp, /home/weka.jar, weka.classifiers.trees.J48, –t, train_file`.
Gilles „SO- przestań być zły”
źródło