J'ai édité une réponse sur Ask Ubuntu qui suggérait ce qui suit
nohup gedit >& /dev/null &
Quand ils voulaient dire
nohup gedit &> /dev/null &
Ce dernier redirige correctement stderr et stdout vers /dev/null
. Je m'attendais à ce que le premier crée un fichier appelé &
ou, plus probablement, produise une erreur comme il le fait pour d'autres cas:
$ echo "foo" >&
bash: syntax error near unexpected token `newline'
Au lieu de cela, il semble fonctionner exactement de la même manière que le premier, une gedit
fenêtre apparaît et aucun message d'erreur n'est imprimé.
Je dois également noter que cela est spécifique au shell:
bash
(4.2.45 (1) -release),zsh
(5.0.2),csh
(version du paquet deb: 20110502-2) ettcsh
(6.18.01): fonctionne comme décrit ci-dessus, aucun message d'erreur, aucun fichier créé.dash
(0.5.7-3):$ nohup gedit >& /dev/null & $ dash: 2: Syntax error: Bad fd number
ksh
(93u + 2012-08-01): échoue, mais un processus est apparemment démarré (1223
) bien qu'aucunegedit
fenêtre n'apparaisse:$ 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 & ^
Alors, pourquoi cette commande s'exécute-t-elle simplement sans erreur (et sans fichier de sortie créé) dans certains shells et échoue dans d'autres? Que >&
fait-on dans le cas apparemment spécial de nohup
? Je suppose que cela >& /dev/null
est interprété comme >&/dev/null
mais pourquoi l'espace ne provoque-t-il pas une erreur dans ces coquilles?
la source
dash
.nohup command
, Exécutez votre TTY indépendante application.According à ma mémoire,dash
prolongéeash
,Debian ash
,ash
développé parOpenBSD
et il est shell limitée, même OS Maemo (Debian base sur N900 mobile) utilise tableau de bord,ash
coquille de famille ont une utilisation limitée attendent de bash ou tcsh.dash
imprimer ma version, mais le package est0.5.7-3
, quel est le vôtre? De plus, êtes-vous sûr de courirdash
? C'est le défaut d'Ubuntu,sh
n'est-ce pas?nohup
ça fait, ma question est pourquoi le>&
semble fonctionner avec nohup seul dans certains shells.Réponses:
est la syntaxe POSIX et est la même que:
Cela est exécuté
nohup gedit
en arrière-plan, puis effectuez une> /dev/null
redirection sans exécuter de commande.n'est pas une syntaxe POSIX et est le
csh
moyen de rediriger stdout et stderr vers / dev / null.csh
n'a pas l'2>&1
opérateur comme dans Bourne, c'est donc le seul moyencsh
de rediriger stderr.zsh
(comme souvent) fournit également lacsh
syntaxe, mais il prend également en charge l' opérateur dex>&y
duplication fd du shell Bourne, ce qui signifie qu'il y a un conflit.redirige
ls
stdout et stderr versfile
, mais si le fichier est2
, vous avez un problèmesignifie rediriger stdout vers la ressource pointée par fd 2 (
dup(2, 1)
). Vous devez donc l'écrire:si vous vouliez rediriger à la fois stdout et stderr de
ls
dans un fichier appelé2
dans le répertoire courant; ou utilisez la syntaxe standard.bash
ne comprenait pas initialement>&
, mais il a&>
plutôt introduit l' opérateur pour cela, rompant la conformité POSIX dans le processus (bien qu'il soit peu probable qu'un script utilisecmd &> xxx
).ksh
copié cet opérateur dans ksh93t + en 2009, mksh dans R35 en 2008 (désactivé enposix
mode) mais pas>&
.bash
ajout de la prise>&
en charge de la version 2.05.busybox a
sh
ajouté un support pour les deux&>
et>&
dans 1.13 (2008).Ni
>&
ni&>
comme signifiant redirection stdout et stderr ne sont POSIX / Bourne.Si vous souhaitez rediriger stdout et stderr de manière portative, la syntaxe est
la source
POSIX/Bourne
par "Bourne"?