Comment rediriger stderr et stdout vers différents fichiers dans la même ligne dans le script?

180

Je le sais beaucoup:

$ command 2>> error

$ command 1>> output

Existe-t-il un moyen de sortir le stderr dans le fichier d'erreur et de sortir stdout dans le fichier de sortie dans la même ligne de bash?

user784637
la source

Réponses:

292

Ajoutez-les simplement en une seule ligne command 2>> error 1>> output

Cependant, notez que >>c'est à ajouter si le fichier contient déjà des données. Alors que, >écrasera toutes les données existantes dans le fichier.

Donc, command 2> error 1> outputsi vous ne souhaitez pas ajouter.

Juste pour le plaisir de terminer, vous pouvez écrire 1>comme juste >puisque le descripteur de fichier par défaut est la sortie. oui 1>et >c'est la même chose.

Alors, command 2> error 1> outputdevient,command 2> error > output

Sujoy
la source
3
Très bonne réponse! J'aime vraiment votre explication sur la façon dont 1>peut être écrit comme>
user784637
En quoi est-ce différent du semblable command &2>err.log, je pense que je suis totalement déroutant pour les sintaxies. (Un lien vers une réponse appropriée de tous les pipe-ismes bash pourrait être en ordre)
ThorSummoner
4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html est ce que je pense que vous recherchez. Fwiw, semble command &2>err.logne pas être tout à fait légitime - l'esperluette dans cette syntaxe est utilisée pour le descripteur de fichier en tant que cible, par exemple command 1>&2rediriger stdout vers stderr.
DreadPirateShawn
@DreadPirateShawn, veuillez ne pas lier l'ABS comme référence - il contient parfois des inexactitudes flagrantes et contient très souvent des exemples de mauvaises pratiques. wiki.bash-hackers.org/howto/redirection_tutorial est une bien meilleure source de référence sur la redirection.
Charles Duffy
27

Essaye ça:

your_command 2>stderr.log 1>stdout.log

Plus d'information

Les chiffres à 0travers 9sont des descripteurs de fichier en bash. 0représente une entrée standard, 1une sortie standard, 2une erreur standard. 3à travers 9sont disponibles pour toute autre utilisation temporaire.

Tout descripteur de fichier peut être redirigé vers un fichier ou vers un autre descripteur de fichier à l'aide de l'opérateur >. Vous pouvez à la place utiliser l'opérateur >>pour ajouter à un fichier au lieu d'en créer un vide.

Usage:

file_descriptor > filename

file_descriptor > &file_descriptor

S'il vous plaît se référer au Guide avancé d' écriture des scripts Bash: Chapitre 20. Réacheminement E / S .

Quintus.Zhou
la source
Thanks.i recherche ceci pendant une heure
dılo sürücü
12

Comme ça:

$ command >>output 2>>error
Didier Trosset
la source
9

Ou si vous aimez mélanger les sorties (stdout et stderr) dans un seul fichier, vous pouvez utiliser:

command > merged-output.txt 2>&1
ztank1013
la source
32
Ce n'est pas une réponse à la question.
Matthias
Pourquoi les gens fusionnent-ils les extrants ou suggèrent-ils de fusionner les extrants?
nurettin
@nurettin: peut-être avez-vous une ligne de script qui exécute simplement une commande et enregistre instantanément la sortie dans un fichier journal. La commande en question peut échouer parfois, vous voulez donc enregistrer toutes les erreurs à ce sujet, mais dans le même fichier journal.
streamofstars
@streamofstars oui bien sûr que vous avez raison peut-être que parfois c'est ce que les gens veulent, je commentais dans le contexte de cette question en tant que quelqu'un qui cherchait des réponses et en a trouvé beaucoup de non pertinentes partout dans le stackoverflow.
nurettin
0

La sortie de plusieurs commandes peut être redirigée. Cela fonctionne pour la ligne de commande ou, plus utilement, dans un script bash. Le -sdirige l'invite de mot de passe à l'écran.

Hereblock cmds stdout / stderr sont envoyés à des fichiers séparés et rien à afficher.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr sont envoyés à un seul fichier et affiché.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr sont envoyés à des fichiers séparés et stdout à afficher.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Selon qui vous êtes (whoami) et votre nom d'utilisateur, un mot de passe peut ou non être requis.

rahogaboom
la source