web-dev-qa-db-fra.com

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

Pour rediriger stdout vers 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 vers un fichier tronqué, je sais utiliser:

cmd &> file.txt

Comment rediriger les deux stdout et stderr dans un fichier? cmd &>> file.txt n'a pas fonctionné pour moi.

1304
flybywire
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.
  2. 2>&1: Rediriger stderr vers "où stdout va actuellement" . Dans ce cas, il s’agit d’un fichier ouvert en mode ajout. En d'autres termes, le &1 réutilise le descripteur de fichier que stdout utilise actuellement.
1709
Alex Martelli

Il existe deux façons de procéder, en fonction de votre version de Bash.

La méthode classique et portable (Bash pre-4) est la suivante:

cmd >> outfile 2>&1

Une manière non portable, 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 (utilisez ensuite la méthode classique)
  • décider si la portabilité même vers Bash pré-4 est un problème (utilisez ensuite la méthode classique)
  • peu importe la syntaxe que vous utilisez, ne le changez pas dans le même script (confusion!)

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

Rappelez-vous également que Bash 4 &>> n’est qu’une syntaxe plus courte. Il n’introduit aucune nouvelle fonctionnalité, ni rien 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

323
TheBonsai

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

cmd >log.out 2>log_error.out

Ajouter serait:

cmd >>log.out 2>>log_error.out
80
Aaron R.

Dans Bash 4 (ainsi que ZSH 4.3.11):

cmd &>>outfile

juste hors de la boîte

60
A B

Cela devrait bien fonctionner:

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

Il stockera tous les journaux dans file.txt et les sauvegardera sur le terminal.

42
Pradeep Goswami

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 fichier dans bash. 

0 représente stdin, 1 correspond à stdout, 2 correspond à stderror. 3 ~ 9 est disponible pour toute autre utilisation temporaire.

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

Utilisation: <Descripteur_fichier> > <nom_fichier | & descripteur_fichier>

Veuillez faire référence à http://www.tldp.org/LDP/abs/html/io-redirection.html

22
Quintus.Zhou

Je suis surpris que dans près de dix ans, personne n’ait encore publié cette approche:

Si vous utilisez des versions plus anciennes de bash où &>> n'est pas disponible, vous pouvez également effectuer les opérations suivantes:

(cmd 2>&1) >> file.txt

Cela crée un sous-shell, il est donc moins efficace que l'approche traditionnelle de cmd >> file.txt 2>&1, mais cette approche me semble plus naturelle et compréhensible:

  1. Rediriger stderr vers stdout.
  2. Redirige la nouvelle sortie standard en l'ajoutant à un fichier.

En outre, les parenthèses suppriment toute ambiguïté d'ordre, surtout si vous souhaitez diriger stdout et stderr vers une autre commande.

0
jamesdlin