Comment puis-je rediriger et ajouter les deux stdout et stderr dans un fichier avec Bash?
Pour rediriger stdout à un fichier tronqué en Bash, je sais pour les utiliser:
cmd > file.txt
Pour rediriger stdout en Bash, en ajoutant à un fichier, je sais pour les utiliser:
cmd >> file.txt
Pour rediriger les deux stdout et stderr à un fichier tronqué, je sais pour les utiliser:
cmd &> file.txt
Comment puis-je rediriger les deux stdout et stderr ajout d'un fichier? cmd &>> file.txt
ne fonctionne pas pour moi.
- Je tiens à préciser que les &>outfile est un Bash (et d'autres) code spécifique et non portable. Le chemin à parcourir portable (similaire à l'ajout de réponses) a toujours été et est toujours >outfile 2>,&1
Vous devez vous connecter pour publier un commentaire.
Bash exécute les redirections de gauche à droite comme suit:
>>file.txt
: Ouvrirfile.txt
en mode ajout et de redirigerstdout
là.2>&1
: Redirigerstderr
à "oùstdout
est actuellement en cours". Dans ce cas, c'est un fichier ouvert en mode ajout. En d'autres termes, la&1
réutilise le descripteur de fichier quistdout
utilise actuellement.cmd >>file1 2>>file2
il devrait obtenir ce que vous voulez./bin/sh : ligne 1 : 16366 Erreur de segmentation (core dumped)/usr/bin/mpg123 /<SNIP>/bigben_hourlychimebeg.mp3 > /dev/null 2>&1
(toutes les heures). Ne stderr exclut erreur de segmentation?2>>&1
ne fonctionne pas. Ce n'est pas une redirection, c'est la copie du descripteur de fichier. Puisque vous redirection de STDOUT vers un fichier en mode ajout, copie que FD vers STDERR c'est donc dans le même modèle.2>&1
est correct.tee
.Il y a deux façons de le faire, selon votre Bash version.
Le classique et portable (Bash pré-4) est:
Un non-compatibles manière, en commençant par Bash 4 est
(analogique
&> outfile
)Pour de bon style de codage, vous devriez
Si votre script commence déjà avec
#!/bin/sh
(peu importe si elles sont destinées ou non), puis le Bash 4 solution, et en général toute Bash-code spécifique, n'est pas la voie à suivre.Rappelez-vous aussi que Bash 4
&>>
est juste plus court de la syntaxe, il n'introduit pas de nouvelle fonctionnalité ou quelque chose comme ça.La syntaxe est (à côté de la redirection de la syntaxe) décrit ici: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
sh
. Vous pouvez changer le shell par défaut en ajoutantSHELL=/bin/bash
à lacrontab -e
fichier.En Bash, vous pouvez également spécifier explicitement vos redirections de fichiers différents:
Ajoutant serait:
cmd >log.out 2>&1
. Je suis en train de modifier ma réponse à supprimer le premier exemple.En Bash 4 (ainsi que ZSH 4.3.11):
vient de sortir de la zone de
Cela devrait fonctionner:
Il va stocker tous les journaux en file.txt ainsi que le dump sur le terminal.
Essayer cette
Votre utilisation de &>x.fichier fonctionne dans bash4. désolé pour ce que : (
Voici quelques conseils supplémentaires.
0, 1, 2...9 sont des descripteurs de fichiers en bash.
0 représente
stdin
, 1 signifiestdout
, 2 supports pourstderror
. 3~9 est libre pour toute autre usage temporaire.Tout descripteur de fichier peuvent être redirigés vers d'autres descripteur de fichier ou de fichiers en utilisant l'opérateur
>
ou>>
(append).Utilisation:
<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
You_command
sur la sortie standard et la sortie standard (stdout) deYou_command
pour le fichieroutput.log
. En outre, il ne sera pas ajouter à la file, mais il va l'écraser.1 > output.log 2>&1
Je suis surpris que dans près de dix ans, personne n'a posté cette approche encore:
Si vous utilisez d'anciennes versions de bash où
&>>
n'est pas disponible, on peut aussi faire:Cela engendre un shell interne est exécuté, il est donc moins efficace que l'approche traditionnelle de
cmd >> file.txt 2>&1
, mais cette approche se sent plus naturel et compréhensible pour moi:Aussi, les parenthèses de supprimer toute ambiguïté de l'ordre, surtout si vous souhaitez pipe stdout et stderr vers une autre commande à la place.