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 à la fois stdout et stderr vers un fichier tronqué, je sais utiliser:
cmd &> file.txt
Comment rediriger stdout et stderr en ajoutant un fichier? cmd &>> file.txt
N'a pas travaillé pour moi.
Réponses:
Bash exécute les redirections de gauche à droite comme suit:
>>file.txt
: Ouvrirfile.txt
en mode ajout etstdout
y rediriger .2>&1
: Redirigerstderr
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 quistdout
utilise actuellement.la source
cmd >>file1 2>>file2
devriez obtenir ce que vous voulez.Il existe deux façons de le faire, selon votre version de Bash.
La manière classique et portable ( Bash pré-4 ) est:
Une manière non portable, à commencer par Bash 4 est
(analogue à
&> outfile
)Pour un bon style de codage, vous devez
Si votre script commence déjà par
#!/bin/sh
(que ce soit voulu ou non), la solution Bash 4, et en général tout code spécifique à Bash, n'est pas la voie à suivre.Rappelez-vous également 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
la source
sh
. Vous pouvez modifier le shell par défaut en ajoutantSHELL=/bin/bash
au début lecrontab -e
fichier.Dans Bash, vous pouvez également spécifier explicitement vos redirections vers différents fichiers:
Ajouter serait:
la source
cmd >log.out 2>&1
. J'édite ma réponse pour supprimer le premier exemple.Dans Bash 4 (ainsi que ZSH 4.3.11):
juste sorti de la boîte
la source
Cela devrait fonctionner correctement:
Il stockera tous les journaux dans file.txt ainsi que les vider sur le terminal.
la source
Essaye ça
Votre utilisation de &> x.file fonctionne dans bash4. Désolé : (
Voici quelques conseils supplémentaires.
0, 1, 2 ... 9 sont des descripteurs de fichiers en bash.
0 signifie
stdin
, 1 signifiestdout
, 2 signifiestderror
. 3 ~ 9 est disponible pour toute autre utilisation temporaire.Tout descripteur de fichier peut être redirigé vers un autre descripteur de fichier ou fichier à l'aide de l'opérateur
>
ou>>
(ajouter).Utilisation: < file_descriptor > > < nom de fichier | & file_descriptor >
Veuillez vous référer à http://www.tldp.org/LDP/abs/html/io-redirection.html
la source
You_command
vers stdout et le stdout deYou_command
vers le fichieroutput.log
. De plus, il ne sera pas ajouté au fichier mais il le remplacera.1 > output.log 2>&1
Je suis surpris que depuis près de dix ans, personne n'ait encore posté cette approche:
Si vous utilisez des versions plus anciennes de bash là où elles
&>>
ne sont pas disponibles, vous pouvez également faire:Cela génère un sous-shell, il est donc moins efficace que l'approche traditionnelle de
cmd >> file.txt 2>&1
, et cela ne fonctionnera donc pas pour les commandes qui doivent modifier le shell actuel (par exemplecd
,pushd
), mais cette approche me semble plus naturelle et compréhensible:De plus, les parenthèses suppriment toute ambiguïté d'ordre, en particulier si vous souhaitez plutôt diriger stdout et stderr vers une autre commande.
la source
cmd >> file 2>&1
fonctionne dans tous les shells et ne nécessite pas de processus supplémentaire pour s'exécuter.