132 votes

Rediriger toute la sortie vers un fichier en utilisant Bash sous Linux ?

J'essaie de rediriger toute la sortie d'un programme en ligne de commande vers un fichier. J'utilise Bash. Une partie de la sortie est dirigée vers le fichier, mais une autre partie apparaît toujours dans le terminal et n'est pas enregistrée dans le fichier.

Des symptômes similaires sont décrits ici :

Rediriger toutes les sorties vers un fichier

Cependant, j'ai essayé la solution proposée (capture stderr) sans succès :

<cmd> <args> > stdout.txt 2> stderr.txt

Le fichier stderr.txt est créé mais est vide.

Un indice possible est que le programme en ligne de commande est un client communiquant avec un serveur sur la même machine. Il se peut qu'une partie de la sortie provienne du programme en ligne de commande. serveur .

Existe-t-il un moyen de capturer toutes les sorties du terminal, quelle que soit leur origine ?

EDITAR:

J'ai confirmé que la sortie manquante est générée par le serveur. L'exécution de la commande dans un terminal distinct entraîne une sortie dans les deux terminaux, je peux acheminer toute la sortie du terminal de commande vers un fichier. Cela soulève la question de savoir comment capturer la sortie du serveur, mais c'est une autre question.

160voto

linuxcdeveloper Points 845

Vous pouvez utiliser cette syntaxe pour rediriger toutes les sorties stderr et stdout vers stdout.txt

<cmd> <args> > allout.txt 2>&1

148voto

Patrick Points 697

Bien qu'il ne s'agisse pas de POSIX, bash 4 dispose de la fonction &> opérateur :

command &> alloutput.txt

76voto

Brian Campbell Points 101107

Si le serveur est lancé sur le même terminal, alors c'est le stderr du serveur qui est vraisemblablement écrit dans le terminal et que vous ne capturez pas.

La meilleure façon de tout capturer serait de courir :

script output.txt

avant de démarrer le serveur ou le client. Cela lancera un nouveau shell avec toutes les sorties du terminal redirigées vers output.txt ainsi que vers le terminal. Démarrez ensuite le serveur à partir de ce nouveau shell, puis le client. Tout ce que vous voyez à l'écran (à la fois votre entrée et la sortie de tout ce qui est écrit dans le terminal à partir de ce shell) sera écrit dans le fichier.

Lorsque vous avez terminé, tapez "exit" pour quitter l'interpréteur de commandes exécuté par l'utilisateur. script commandement.

6voto

chovy Points 8012

Vous pouvez exécuter un subshell et rediriger toute la sortie tout en mettant le processus en arrière-plan :

( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid

4voto

ThorSummoner Points 396

J'ai eu des problèmes avec un programme qui s'est écrasé * toux PHP toux * En cas de crash, le shell dans lequel il a été exécuté rapporte la raison du crash, Segmentation fault (core dumped)

Pour éviter que cette sortie ne soit pas enregistrée, la commande peut être exécutée dans un sous-shell qui capturera et dirigera ce type de sortie :

sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X