Sur ce thread SO et quelques autres threads, j'ai vu les commandes suivantes pour rediriger stdout
et stderr
vers un fichier.
Sont-ils tous équivalents? Y a-t-il une différence entre eux?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
shell
zsh
io-redirection
Amelio Vazquez-Reina
la source
la source
Réponses:
Puisque vous avez tagué
zsh
, permettez-moi de vous dire que les 3 redirections fonctionnent exactement de la même manière. Comme vous avez pu lire dans les deux postes en double (celui du commentaire et celui de votre poste), ils ont tous redirectstderr
àstdout
qui à leur tour est redirigé vers le fichier « logfile » (c. -à le fichier journal contiendra à la fois la sortie et les erreurs ).Mais leur comportement change beaucoup en fonction du shell dans lequel vous vous trouvez.
Les trois styles de redirections fonctionnent bien de la même manière
bash
etzsh
Mais:
Fonctionne uniquement
>&
danscsh
outcsh
En travaux
ksh
uniquement2>&1
.Je déteste
ksh
. Alors qu'il>&
vient de donner une erreur, l'&>
arrière - plan a fait une partie de la commande et a vidé le fichier journal (s'il n'est pas vide).la source
sh
? Si c'est un shell POSIX,&>
et>&
ne fonctionnera pas.&>
et>&
semi-équivalence (clobber)La
zsh
section des redirections manuelles indique que:&>
>&
sont équivalents.
Les deux vont encombrer le fichier - tronquer le fichier à 0 octet avant d'écrire dessus, comme ce
> file
serait le cas dans le cas STDIN uniquement.Cependant , la
bash
section des redirections manuelles ajoute que:Ainsi, pendant que vous balisez
zsh
, il est probablement judicieux d'obtenir la mémoire des doigts sous la première forme si jamais vous écriviez unbash
script.>> logfile 2>&1
et&>>
équivalence (en annexe)Ici,
logfile
n'est pas écrasé, mais ouvert pour l'écriture à la fin du fichier, c'est-à-dire en mode ajout (O_APPEND
).L'équivalent dans les deux
{ba,z}sh
est:Dans
bash
:(Remarque: l'utilisation clobber de
&>
over>&
dans la section ci-dessus est à nouveau recommandée étant donné qu'il n'y a qu'une seule façon de l'ajouterbash
.)zsh
permet à la fois&>>
et>>&
formes.la source