web-dev-qa-db-fra.com

Quelle est la différence entre &> et 2> & 1

Il existe deux formes de redirection sortie standard et erreur standard vers sortie standard. Mais lequel est le meilleur? et pourquoi le &> est-il considéré comme parfait?

Je ne trouve pas quelles sont les différences, de sorte que de nombreux tutoriels et même le manuel bash indiquent que &> est préférable!

Alors, pourquoi devrais-je utiliser &> et non 2>&1

Utilisant principalement bash Shell


EDIT: Merci pour les commentaires

Seulement> & fonctionne en csh ou tcsh

En ksh seulement 2> & 1 fonctionne.

tiret utiliser> fichier 2> & 1 redirection seulement

Ensuite, lequel utiliser pour que mon script soit compatible avec d’autres systèmes, quels que soient les shells utilisés!

28
Maythux

La page de manuel de Bash mentionne qu'il y a deux façons de rediriger stderr et stdout : &> file et >& file. Maintenant, remarquez qu'il est écrit à la fois stderr et stdout.

Dans le cas de ce >file 2>&1, nous procédons à la redirection de stdout (1) vers le fichier, mais demandons également à stderr (2) d'être redirigé au même endroit que stdout! Donc, le but peut être le même, mais l'idée légèrement différente. En d'autres mots "John, va à l'école; Suzzie va où John va".

Qu'en est-il de la préférence? &> est une chose bash. Donc, si vous portez un script, cela ne le fera pas. Mais si vous êtes certain à 100% que votre script ne fonctionnera que sur le système avec bash - il n'y a aucune préférence

Voici un exemple avec dash, le shell Debian Amquist qui est celui par défaut d’Ubuntu.

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

Comme vous pouvez le constater, stderr n'est pas redirigé

Pour adresser vos modifications dans la question, vous pouvez utiliser l'instruction if pour vérifier la variable $ Shell et modifier les redirections en conséquence.

Mais dans la plupart des cas, > file 2>&1 devrait fonctionner


En termes plus techniques, la forme [integer]>&Word est appelée descripteur de fichier de sortie en double , et est une fonctionnalité spécifiée par le standard POSIX Shell Command Language, pris en charge par la plupart des shells compatibles POSIX et de type Brourne.

Voir aussi Que signifie exactement dans la redirection de sortie?

20

Je recommanderais généralement de suivre la façon de faire les choses Bourne-again Shell , car bash est sans doute le shell Unix le plus populaire. Bash utilise généralement &> ou 2>&1. IMHO, ni est "parfait", donc je recommande d'oublier ce non-sens. De manière réaliste, celle que vous devriez utiliser dépend de ce que vous essayez de faire.

2>&1 fusionne stderr avec stdout, ce qui peut être utile si, par exemple, vous souhaitez diriger le texte stderr. Ainsi, par exemple, si vous voulez voir si un programme imprime un certain message stderr, mais que vous ne voulez pas que votre écran soit rempli (probablement) de déchets sans importance, vous pouvez faire quelque chose comme program 2>&1 | grep crashed, qui effectuera une recherche dans la stdout et stderr à partir d'un fichier. programme appelé "programme" pour le mot "crashé".

D'autre part, si vous ne souhaitez pas qu'un programme imprime quoi que ce soit, vous pouvez simplement exécuter program &> /dev/null, qui redirigera stderr et stdout vers/dev/null, un fichier spécial qui fait disparaître les choses comme par magie. Ou, si vous souhaitez enregistrer la sortie d'un programme (peut-être pour signaler un bogue), vous pouvez rediriger stderr et stdout vers un fichier: program &> log.txt redirige toutes les données vers un fichier appelé "log.txt". Si vous le souhaitez, vous pouvez rediriger stdout et stderr via program 2> log.txt > log.txt ou program 2>&1 | cat > log.txt, les deux effets ayant le même effet que d'utiliser &>. Si vous faites quelque chose comme program 2>&1 > file, seul stdout sera redirigé, mais stderr peut toujours être redirigé vers un autre programme, tel que cat, qui pourrait être redirigé comme indiqué ci-dessus. Cependant, taper &> est plus facile que tous les exemples ci-dessus, car cela implique de taper moins de caractères (et c'est un peu plus facile à lire pour les êtres humains). Notez que program 2> log.txt > log.txt pourrait être plus susceptible de fonctionner sur des shells autres que bash.

PS: si vous craignez que des personnes n’utilisent d’autres coquillages, vous pouvez ajouter quelque chose comme première ligne de votre script, appelé "nombre magique" ou "Shebang". C'est essentiellement un moyen de s'assurer que les autres ordinateurs (en particulier ceux qui utilisent un système d'exploitation de type Unix) savent quel programme utiliser pour exécuter un script. Différents scripts utilisent différents shebangs. Un Shebang pour un script bash ressemble à ceci:

#!/bin/bash

Si vous utilisez ce qui précède comme première ligne d'un script donné, bash sera généralement utilisé pour exécuter ce script. Cela rendra beaucoup plus difficile pour quelqu'un d'exécuter accidentellement le script avec le mauvais shell.

PS: Je ne vais pas mentir: jusqu'à présent, je ne savais pas que l'on pourrait utiliser >&, mais, pour le moment, bash semble faire la même chose que &>. Vous apprenez quelque chose de nouveau chaque jour.

6
TSJNachos117

From Manuel de référence Bash -> 3.6.4 Redirection de la sortie standard et de l'erreur standard :

Cette construction permet à la fois la sortie standard (descripteur de fichier 1) et la sortie d'erreur standard (descripteur de fichier 2) d'être redirigées vers le fichier dont le nom est l'extension de Word.

Il existe deux formats pour rediriger la sortie standard et l’erreur standard:

&>Word

et

>&Word

Parmi les deux formes, la première est préférée. Ceci est sémantiquement équivalent à

>Word 2>&1

Lorsque vous utilisez le second formulaire, Word ne peut pas être étendu à un nombre ou à un "-". Si tel est le cas, d'autres opérateurs de redirection s'appliquent (voir la section Copie de descripteurs de fichiers ci-dessous) pour des raisons de compatibilité.

Il est également bon de se référer à le wiki de Greg sur Input And Output -> 4.2. Manipulation des descripteurs de fichiers :

Pour plus de commodité, Bash vous propose également une autre forme de redirection. L'opérateur de redirection &> n'est en réalité qu'une version abrégée de ce que nous avons fait ici [2>&1]; rediriger à la fois stdout et stderr vers un fichier.

4
fedorqui

Alors, pourquoi devrais-je utiliser &> et pas 2> & 1

2>&1 est standard Bourne/POSIX Shell.

&> est une extension bash et non de jure standard.

Si vous écrivez des scripts à l'aide d'extensions bash, vous rencontrerez tôt ou tard des problèmes d'échec avec des messages d'erreur de syntaxe cryptique, car ils sont exécutés dans un shell standard.

4
Stephen M. Webb