Comment puis-je rediriger et ajouter stdout et stderr à un fichier avec Bash?

rediriger stdout pour un fichier tronqué en Bash, je sais pour les utiliser:

cmd > file.txt

rediriger stdout en Bash, en ajoutant à un fichier, je sais pour les utiliser:

cmd >> file.txt

pour rediriger les deux stdout et stderr vers un fichier tronqué, je sais utiliser:

cmd &> file.txt

Comment puis-je rediriger les deux stdout et stderr en annexe à un fichier? cmd &>> file.txt n'a pas fonctionné pour moi.

1221
demandé sur Jahid 2009-05-18 08:19:45

6 réponses

cmd >>file.txt 2>&1

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

  1. >>file.txt : ouvrez file.txt en mode ajout et redirigez stdout là.
  2. 2>&1 : "Redirection de 151950920" à , "où stdout est actuellement en cours" . Dans ce cas, c'est un fichier ouvert en mode ajout. En d'autres termes, le &1 réutilise le descripteur de fichier qui stdout actuellement utiliser.
1607
répondu Alex Martelli 2017-03-09 14:55:58

il y a deux façons de faire cela, en fonction de votre version Bash.

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

cmd >> outfile 2>&1

Un non-compatibles manière, en commençant par Bash 4 est

cmd &>> outfile

(analogue à &> outfile )

pour un bon style de codage, vous devriez

  • décider si la portabilité est un sujet de préoccupation (alors utilisation classique)
  • décider si la portabilité même pour Bash pre-4 est une préoccupation (puis utiliser la manière classique)
  • peu importe la syntaxe que vous utilisez, ne pas la modifier dans le même script (confusion!)

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

rappelez-vous aussi que Bash 4 &>> est juste une syntaxe plus courte - il n'introduit aucune nouvelle fonctionnalité ou quoi que ce soit de ce genre.

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

303
répondu TheBonsai 2014-03-23 11:24:34

dans Bash vous pouvez également spécifier explicitement vos redirections vers des fichiers différents:

cmd >log.out 2>log_error.out

Ajoutant:

cmd >>log.out 2>>log_error.out
76
répondu Aaron R. 2015-12-11 15:39:21

En Bash 4 (ainsi que ZSH 4.3.11):

cmd &>>outfile

vient de sortir de la boîte

57
répondu A B 2013-05-20 08:47:00

Cela devrait fonctionner:

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

il stockera tous les journaux dans le fichier .txt ainsi que les décharger sur le terminal.

36
répondu Pradeep Goswami 2016-03-03 18:35:42

Essayez cette

You_command 1>output.log  2>&1

votre usage de & > X. file fonctionne dans bash4. désolé pour cela: (

Voici quelques conseils supplémentaires.

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

0 signifie stdin , 1 signifie stdout , 2 signifie stderror . 3~9 est libre pour toute autre usage temporaire.

N'importe quel descripteur de fichier peut être redirigé vers un autre fichier descripteur ou fichier en utilisant l'opérateur > ou >> (annexe).

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

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

20
répondu Quintus.Zhou 2018-03-10 03:47:29