Ich habe eine Antwort auf Ask Ubuntu bearbeitet , die Folgendes vorschlug
nohup gedit >& /dev/null &
Als sie es tatsächlich meinten
nohup gedit &> /dev/null &
Letzteres leitet sowohl stderr als auch stdout korrekt nach um /dev/null
. Ich hatte damit gerechnet, dass ersteres entweder eine Datei mit dem Namen "" erstellt &
oder eher einen Fehler ausgibt, wie dies in anderen Fällen der Fall ist:
$ echo "foo" >&
bash: syntax error near unexpected token `newline'
Stattdessen scheint es genauso zu funktionieren wie das vorherige, es gedit
erscheint ein Fenster und es wird keine Fehlermeldung ausgegeben.
Ich sollte auch beachten, dass dies Shell-spezifisch ist:
bash
(4.2.45 (1) -release),zsh
(5.0.2),csh
(deb package version: 20110502-2) undtcsh
(6.18.01): Funktioniert wie oben beschrieben, keine Fehlermeldung, keine Dateien erstellt.dash
(0,5,7-3):$ nohup gedit >& /dev/null & $ dash: 2: Syntax error: Bad fd number
ksh
(93u + 2012-08-01): schlägt fehl, aber anscheinend wird ein Prozess gestartet (1223
), obwohl keingedit
Fenster angezeigt wird:$ nohup gedit >& /dev/null & [1] 1223 $ ksh: /dev/null: bad file unit number
fish
(2.0.0):> nohup gedit >& /dev/null & fish: Requested redirection to something that is not a file descriptor /dev/null nohup gedit >& /dev/null & ^
Warum wird dieser Befehl in einigen Shells einfach ohne Fehler (und ohne erstellte Ausgabedatei) ausgeführt und in anderen schlägt er fehl? Was >&
macht man in dem scheinbar besonderen Fall von nohup
? Ich vermute, dass >& /dev/null
dies so interpretiert wird, >&/dev/null
aber warum verursacht der Raum in diesen Shells keinen Fehler?
quelle
dash
.nohup command
, Laufen unabhängig tty Ihre application.According zu meinem Gedächtnis,dash
verlängert vonash
,Debian ash
,ash
entwickelt vonOpenBSD
und es ist begrenzt Panzer, auch Maemo OS (Debian Base auf n900 Handy) verwendet dash,ash
Familie Shell haben begrenzte Nutzung von bash oder tcsh erwarten.dash
Version ausdrucken kann, aber das Paket ist0.5.7-3
, was ist deins? Bist du dir auch sicher, dass du rennstdash
? Das ist Ubuntus Standard,sh
nicht wahr?nohup
, meine Frage ist, warum das>&
mit nohup alleine in einigen Shells zu funktionieren scheint.Antworten:
ist POSIX-Syntax und entspricht:
Das wird
nohup gedit
im Hintergrund ausgeführt und führt dann eine> /dev/null
Umleitung durch, ohne einen Befehl auszuführen .ist keine POSIX-Syntax und ist die
csh
Möglichkeit, sowohl stdout als auch stderr nach / dev / null umzuleiten.csh
hat nicht den2>&1
Operator wie in Bourne, daher ist es der einzige Wegcsh
, stderr umzuleiten.zsh
(wie oft) bietet auch diecsh
Syntax, unterstützt aber auch denx>&y
fd-Duplizierungsoperator der Bourne-Shell, was bedeutet, dass dort ein Konflikt vorliegt.leitet
ls
die Befehle stdout und stderr weiter anfile
, aber wenn die Datei ist2
, haben Sie ein Problem alsbedeutet, dass stdout zu der Ressource umgeleitet wird, auf die fd 2 (
dup(2, 1)
) zeigt. Also musst du es schreiben:Wenn Sie sowohl stdout als auch stderr von
ls
in eine Datei umleiten möchten, die2
im aktuellen Verzeichnis aufgerufen wird . oder verwenden Sie die Standardsyntax.bash
anfangs nicht verstanden>&
, aber&>
stattdessen wurde der Operator eingeführt , wodurch die POSIX-Konformität verletzt wurde (obwohl es unwahrscheinlich ist, dass ein Skript verwendet wirdcmd &> xxx
).ksh
kopierte diesen Operator in ksh93t + im Jahr 2009, mksh in R35 im Jahr 2008 (deaktiviert imposix
Modus), aber nicht>&
.bash
Unterstützung für>&
in 2.05 hinzugefügt .busybox
sh
hat die Unterstützung sowohl für&>
als auch>&
für 1.13 (2008) hinzugefügt .Weder als Redirect
>&
noch&>
als stdout oder stderr gelten POSIX / Bourne.Wenn Sie sowohl stdout als auch stderr portabel umleiten möchten, lautet die Syntax
quelle
POSIX/Bourne
von "Bourne"?