Question Comment puis-je rediriger et ajouter à la fois stdout et stderr dans un fichier avec Bash?


Pour rediriger stdout à un fichier tronqué dans Bash, je sais utiliser:

cmd > file.txt

Pour rediriger stdout dans Bash, en ajoutant un fichier, je sais utiliser:

cmd >> file.txt

Pour rediriger les deux stdout et stderr à un fichier tronqué, je sais utiliser:

cmd &> file.txt

Comment puis-je rediriger les deux stdout et stderr ajouter à un fichier cmd &>> file.txt N'a pas travaillé pour moi.


1182
2018-05-18 04:19


origine


Réponses:


cmd >>file.txt 2>&1

Bash exécute les redirections de gauche à droite comme suit:

  1. >>file.txt: Ouvert file.txt en mode ajout et redirection stdout Là.
  2. 2>&1: Redirection stderr à "où stdout va actuellement ". Dans ce cas, c'est un fichier ouvert en mode ajout. En d'autres termes, le &1 réutilise le descripteur de fichier stdout utilise actuellement.

1559
2018-05-18 04:23



Il y a deux façons de le faire, en fonction de votre version de Bash.

Le classique et portable (Bash pré-4) est:

cmd >> outfile 2>&1

Une manière non portable, en commençant par Bash 4 est

cmd &>> outfile

(analogique à &> outfile)

Pour un bon style de codage, vous devriez

  • décider si la portabilité est une préoccupation (alors utilisez la méthode classique)
  • décider si la portabilité, même pour Bash pré-4 est une préoccupation (alors utilisez la méthode classique)
  • quelle que soit la syntaxe utilisée, ne la modifiez pas dans le même script (confusion!)

Si votre script commence déjà par #!/bin/sh (peu importe si c'est voulu ou pas), alors la solution Bash 4, et en général tout code spécifique à Bash, n'est pas la solution.

Rappelez-vous aussi que Bash 4 &>> est juste une syntaxe plus courte - il n'introduit aucune nouvelle fonctionnalité ou quelque chose comme ça.

La syntaxe est (à côté d'une autre syntaxe de redirection) décrite ici: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


298
2018-05-18 04:42



Dans Bash, vous pouvez également spécifier explicitement vos redirections vers différents fichiers:

cmd >log.out 2>log_error.out

L'ajout serait:

cmd >>log.out 2>>log_error.out

76
2017-07-24 18:09



Dans Bash 4 (ainsi que ZSH 4.3.11):

cmd &>>outfile

juste hors de la boîte


57
2018-03-27 18:24



Cela devrait fonctionner correctement:

your_command 2>&1 | tee -a file.txt

Il va stocker tous les journaux fichier.txt ainsi que les vider sur le terminal.


32
2017-12-12 06:17



Essaye ça

You_command 1>output.log  2>&1

Votre utilisation de &> x.file fonctionne dans bash4. Désolé : (

Voici quelques conseils supplémentaires.

0, 1, 2 ... 9 sont des descripteurs de fichiers dans bash.

0 signifie stdin, 1 signifie stdout, 2 correspond à stderror. 3 ~ 9 est disponible pour tout autre usage temporaire.

Tout descripteur de fichier peut être redirigé vers un autre descripteur de fichier ou fichier en utilisant l'opérateur > ou >>(ajouter).

Usage: <fichier_descripteur> > <nom de fichier | & fichier_descripteur>

S'il vous plaît référence à http://www.tldp.org/LDP/abs/html/io-redirection.html


19
2018-04-10 05:56