Je cherche juste la différence entre
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
et leur portabilité avec non-Bourne shells
comme tcsh
, mksh
, etc.
Pour le fond:
Abordons d'abord leur fonction. Pour référence, voir Advanced Bash-Scripting Guide .
2>&-
La forme générale de celui-ci est M>&-
, où "M" est un numéro de descripteur de fichier. Cela fermera la sortie pour le descripteur de fichier référencé, c'est-à-dire "M" .
2>/dev/null
La forme générale de celui-ci est M>/dev/null
, où "M" est un numéro de descripteur de fichier. Cela redirigera le descripteur de fichier, "M" , vers /dev/null
.
2>&1
La forme générale de celui-ci est M>&N
, où "M" & "N" sont un descripteur de fichier Nombres. Il combine la sortie des descripteurs de fichiers "M" et "N" en un seul flux.
|&
Ce n'est qu'une abréviation de 2>&1 |
. Il a été ajouté dans Bash 4.
&>/dev/null
Ce n'est qu'une abréviation de >/dev/null 2>&1
. Il redirige le descripteur de fichier 2 (STDERR) et le descripteur 1 (STDOUT) vers /dev/null
.
>/dev/null
Ce n'est qu'une abréviation de 1>/dev/null
. Il redirige le descripteur de fichier 1 (STDOUT) vers /dev/null
.
Je n'ai pas beaucoup traité avec d'autres shells en dehors de csh
et tcsh
. Mon expérience avec ces 2 par rapport aux opérateurs de redirection de bash, est que bash est supérieur à cet égard. Voir page de manuel tcsh pour plus de détails.
Parmi les commandes que vous avez demandées, aucune n'est directement prise en charge par csh/tcsh. Il faudrait utiliser différentes syntaxes pour construire des fonctions similaires.
C'est pour rediriger le STDERR & STDOUT:
2>/dev/null
Rediriger STDERR vers/dev/null (empêcher de s'afficher sur la console)
|&
Rediriger STDERR et STDOUT vers STDIN de la commande canalisée (cmd1 | & cmd2)
&>/dev/null
Redirige STDERR et STDOUT vers/dev/null (rien ne s'affiche sur la console)
>/dev/null
Rediriger STDOUT vers/dev/null (seul STDERR s'affiche sur la console)
2>&-
Est pour fermer un descripteur de fichier utilisé avec la redirection
Ce sont toutes des méthodes de redirection standard pour les shells Bourne.
Considérez ceci comme un addendum à la réponse sélectionnée. Vous voudrez peut-être savoir quels formulaires sont POSIX et lesquels ne le sont pas.
Deux formulaires POSIX sont concernés:
2.7.2 Rediriger la sortie
Les deux formats généraux de redirection de sortie sont:
[n]> Word
[n]> | Word
où le n facultatif représente le numéro de descripteur de fichier. Si le numéro est omis, la redirection doit se référer à la sortie standard (descripteur de fichier 1).
La redirection de sortie utilisant le format '>' échouera si l'option noclobber est définie (voir la description de set -C) et que le fichier nommé par l'expansion de Word existe et est un fichier normal. Sinon, redirection en utilisant le '>' ou "> |" les formats doivent entraîner la création et l'ouverture du fichier dont le nom résulte de l'expansion de Word pour une sortie sur le descripteur de fichier désigné, ou une sortie standard si aucun n'est spécifié. Si le fichier n'existe pas, il doit être créé; sinon, il sera tronqué pour être un fichier vide après son ouverture.
-
2.7.6 Duplication d'un descripteur de fichier de sortie
L'opérateur de redirection:
[n]> & Word
doit dupliquer un descripteur de fichier de sortie d'un autre ou en fermer un. Si Word est évalué à un ou plusieurs chiffres, le descripteur de fichier désigné par n, ou la sortie standard si n n'est pas spécifié, doit être fait pour être une copie du descripteur de fichier désigné par Word; si les chiffres dans Word ne représentent pas un descripteur de fichier déjà ouvert pour la sortie, une erreur de redirection doit en résulter; voir Conséquences des erreurs shell. Si Word est évalué à "-", le descripteur de fichier n ou la sortie standard si n n'est pas spécifié, est fermé. Les tentatives de fermeture d'un descripteur de fichier qui n'est pas ouvert ne constituent pas une erreur. Si Word est évalué à autre chose, le comportement n'est pas spécifié.
Donc:
Function POSIX-compat POSIX
2>&- Yes close
2>/dev/null Yes redir
2>&1 Yes dup
|& No
&>/dev/null No
>/dev/null Yes redir
>&/dev/null ? ?dup
La dernière ligne n'est pas dans la question d'origine, mais elle fonctionne sans se plaindre en bash. (Fonctionne également avec/dev/tty substitué à/dev/null).