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.
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.
&>
compatibilité GNU bash, il est vivement recommandé de ne pas l'utiliser, car son analyse peut casser la sémantique des scripts POSIX existants, et mksh le désactive déjà en mode POSIX.^ /dev/null
quoi ça sert?Réponses:
Pour le fond:
D'abord abordons la fonction de ceux-ci. Pour plus d'informations, reportez-vous au document Advanced Bash-Scripting Guide .
Les fonctions
2>&-
La forme générale de celui-ci est
M>&-
où "M" est un numéro de descripteur de fichier. Ceci 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 celle-ci est
M>&N
où "M" et "N" sont des numéros de descripteur de fichier. Il combine la sortie des descripteurs de fichier "M" et "N" en un seul flux.|&
Ceci est juste une abréviation de
2>&1 |
. Il a été ajouté dans Bash 4.&>/dev/null
Ceci est juste 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
Ceci est juste une abréviation de
1>/dev/null
. Il redirige le descripteur de fichier 1 (STDOUT) vers/dev/null
.Portabilité vers non-bash, tcsh, mksh, etc.
Je n'ai pas beaucoup traité d'autres coquillages en dehors de
csh
ettcsh
. Mon expérience avec ces 2 par rapport aux opérateurs de redirection de bash, est que bash est supérieur à cet égard. Voir la 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. Vous devrez utiliser différentes syntaxes pour créer des fonctions similaires.
la source
2>&-
vs2>/dev/null
(mis à part le fait que certains programmes "mal" écrits ne fonctionnent pas2>&-
correctement)?&>
était aubash
départ (et casse la compatibilité entre Bourne et POSIX car cela signifie quelque chose de différent là-bas, bien qu'il soit peu probable qu'il soit touché).>&
et|&
viennent de(t)csh
(et c'est leur seul moyen de rediriger stderr). Ils étaient présentszsh
depuis le début et n’ont été ajoutés que récemmentbash
. Voir aussirc
pour des opérateurs mieux conçus.(+2-2=0)
. Maintenant, pour la partie édition, je n'édite pas beaucoup, mais dans ce cas, je le ferais, car cela clarifie le fait que les données après l'opération seraient àN
. Je vous ai lu répondre, et c'est très bien dans tous les aspects. Juste cette petite ambiguïté m'a fait réfléchir, c'est pourquoi l'édition. Mais ok, n'hésitez pas à le ré-ajouter ou le rejeter, comme vous le souhaitez. J'espère que je pourrais expliquer le point. Continuez votre bon travail.C'est pour rediriger le STDERR & STDOUT:
2>/dev/null
Rediriger STDERR vers / dev / null (empêcher l’apparition sur la console)
|&
Rediriger STDERR et STDOUT vers STDIN de la commande canalisée (cmd1 | & cmd2)
&>/dev/null
Rediriger les deux STDERR & STDOUT vers / dev / null (rien ne s'affiche sur la console)
>/dev/null
Rediriger STDOUT vers / dev / null (seul STDERR est affiché sur la console)
2>&-
Est-ce pour fermer un descripteur de fichier utilisé avec la redirection
Ce sont toutes des méthodes de redirection standard pour les shells Bourne.
la source
|&
et ne&>/dev/null
sont pas portables.Considérez ceci comme un addenda à la réponse sélectionnée. Vous voudrez peut-être savoir quelles formes sont POSIX et lesquelles ne le sont pas.
Deux formes POSIX sont impliquées:
-
Donc:
La dernière ligne ne se trouve pas dans la question initiale, mais cela fonctionne sans problème en bash. (Fonctionne également avec / dev / tty substitué à / dev / null).
la source