Pommes et oranges. Mais d'abord ...
En ce qui concerne 2>&1
vs &>
, 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 tee
commande 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 ( -a
dit d'ajouter plutôt que d'écraser).
Comparez cela à la deuxième version où la combinaison stdout et stderr écrase le log
fichier 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.sh
mê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.
tee
est de dupliquer l'entrée. Si l'objectif n'est pas de dupliquer l'entrée, n'utilisez pastee
.