Linux( Bash): rediriger toutes les sorties vers le fichier [dupliquer]

cette question a déjà une réponse ici:

j'essaie de rediriger toute la sortie d'un programme en ligne de commande vers un fichier. Je suis à l'aide de Bash. Une partie de la sortie est dirigée vers un l' mais certains apparaissent encore dans le terminal et ne sont pas stockés dans le fichier.

symptômes similaires sont décrits ici:

rediriger toute la sortie vers le 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 de ligne de commande est le client communique avec un serveur sur la même machine. Il se peut qu'une partie de la sortie Vienne du serveur .

Existe-t-il un moyen de capturer toute la sortie du terminal, quelle que soit son origine?

EDIT:

j'ai confirmé que la sortie manquante est générée par le serveur. Exécuter la commande dans un terminal séparé provoque une certaine sortie dans les deux terminaux, je peux faire passer toute la sortie du terminal de commande à un fichier. Cela soulève des questions sur la façon de capturer la sortie du serveur, mais c'est une autre question.

58
demandé sur Community 2013-05-30 21:03:42

6 réponses

si le serveur est démarré sur le même terminal, alors c'est le stderr du serveur qui est probablement écrit sur le terminal et que vous ne capturez pas.

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

script output.txt

avant de lancer le serveur ou le client. Ceci lancera un nouveau shell avec toutes les sorties de terminal redirigées vers l'extérieur.txt ainsi que le terminal. Puis démarrer le serveur à partir de cette nouvelle 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 sur le terminal à l'intérieur de ce shell) sera écrit dans le fichier.

lorsque vous avez terminé, tapez" exit "pour sortir du shell et exécutez la commande script .

50
répondu Brian Campbell 2013-05-30 17:20:46

vous pouvez utiliser cette syntaxe pour rediriger toutes les sortie stderr et stdout vers stdout.txt

<cmd> <args> > allout.txt 2>&1 
84
répondu developer 2018-04-16 14:25:50

bien que non POSIX, bash 4 A l'opérateur &> :

command &> alloutput.txt

31
répondu Patrick Pijnappel 2016-04-23 07:10:58

vous pouvez exécuter une sous-couche 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
3
répondu chovy 2015-12-16 17:39:32

la bonne réponse est ici: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html

your_command | ssh username@server "cat > filename.txt"
2
répondu Morlock 2014-08-01 14:56:13

j'ai eu des problèmes avec un programme défaillant * toux PHP toux * Lors de l'écrasement de la coquille, il a couru dans les rapports de l'écrasement de la raison, Segmentation fault (core dumped)

pour éviter que cette sortie ne soit pas journalisée, la commande peut être exécutée dans un sous-puits qui capturera et dirigera ce genre de sortie:

sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1
2
répondu ThorSummoner 2017-05-23 10:31:19