Quelle est la différence dans la syntaxe pour capturer la sortie bash?

2

J'utilise habituellement

./aaa.sh 2>&1 | tee -a log

Mais trouvé une nouvelle commande qui semble plus facile:

./aaa.sh &> log

Alors qu'est-ce que j'abandonne dans le second cas?

ajax_velu
la source
1
Ils ne sont pas du tout comparables. Le tout teeest de dupliquer l'entrée. Si l'objectif n'est pas de dupliquer l'entrée, n'utilisez pas tee.
n.caillou
1
Son teenom est intéressant car il fonctionne comme un raccord de tuyau en "T" , c’est-à-dire 1 entrée - 2 sorties. Cela est même indiqué dans la page de manuel.
Digital Trauma

Réponses:

7

Pommes et oranges. Mais d'abord ...

En ce qui concerne 2>&1vs &>, ils agissent tous les deux pour diriger stderr au même endroit où stdout est dirigé.

Mais vous abandonnez la portabilité avec le second car il n’est pas compatible POSIX et tout script l’utilisant ne fonctionnera que avec les shells qui le prennent en charge.

Cela étant dit, ils sont "sémantiquement équivalents" comme décrit sur la page de manuel Bash ...

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

      &>word    and
      >&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, le mot ne peut pas être étendu à un nombre ou à -. 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é.

Cependant, il y a plus que ça. Vous utilisez également la teecommande qui ajoute des fonctionnalités supplémentaires à la première version. Il prendra son entrée stdin et le dirigera vers deux endroits différents: stdout (généralement votre écran / terminal si vous l'exécutez de manière interactive) et le fichier spécifié auquel les données seront ajoutées ( -adit d'ajouter plutôt que d'écraser).

Comparez cela à la deuxième version où la combinaison stdout et stderr écrase le logfichier et ne s'affiche pas sur votre écran / terminal.

Conclusion: Comme mentionné au début ce sont vraiment deux commandes tout à fait différentes mais, stretching la notion d'équivalence, d'une manière générale la première version est supérieure car il est portable et vous obtenez l'avantage de voir la sortie aaa.shmême si elle est en cours d' enregistrement à un fichier. Bien sûr, si vous ne voulez pas voir cela ou si vous voulez effacer le contenu du fichier précédent, alors c'est une autre histoire. Pommes et oranges.

Couche b
la source
1
Et bien sûr, un gros avantage teeest que l'impression à la fois à l'écran et au fichier.
Arkadiusz Drabczyk
4

Deux choses:

  • teeimprime son entrée à la fois dans le fichier nommé et dans la sortie standard, en pratique sur votre terminal. Une redirection directe similaire >ou &>uniquement à l'origine de l'écriture du fichier.

  • tee -a ajoute au fichier nommé, une redirection >ou l’ &>écrase. Utilisez >>ou &>>ou >> file 2>&1pour ajouter une redirection.

ilkkachu
la source