web-dev-qa-db-fra.com

Différence entre 2> & -, 2> / dev / null, | &, &> / dev / null et> / dev / null 2> & 1

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.

208
Det

Pour le fond:

  • a number 1 = standard out (i.e. STDOUT)
  • a number 2 = standard error (i.e. STDERR)
  • si un nombre n'est pas explicitement donné, alors le numéro 1 est assumé par le Shell (bash)

Abordons d'abord leur fonction. Pour référence, voir 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. 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.

Portabilité vers non-bash, tcsh, mksh, etc.

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.

256
slm

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.

12
BriGuy

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).

4
Craig Hicks