web-dev-qa-db-ja.com

LinuxでBashを使用してすべての出力をファイルにリダイレクトしますか?

コマンドラインプログラムからのすべての出力をファイルにリダイレクトしようとしています。 Bashを使用しています。出力の一部はファイルに送信されますが、一部はまだ端末に表示され、ファイルに保存されません。

同様の症状は次のとおりです。

すべての出力をファイルにリダイレクトする

しかし、私は提案された解決策(キャプチャstderr)を試みましたが成功しませんでした:

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

ファイルstderr.txtは作成されますが、空です。

考えられる手がかりは、コマンドラインプログラムが同じマシン上のサーバーと通信するクライアントであるということです。出力の一部がserverからのものである可能性があります。

発信元に関係なく、端末からのすべての出力をキャプチャする方法はありますか?

編集:

不足している出力がサーバーによって生成されることを確認しました。コマンドを別のターミナルで実行すると、両方のターミナルで出力が発生します。コマンドターミナルからのすべての出力をファイルにパイプできます。これにより、サーバー出力をキャプチャする方法に関する問題が発生しますが、それは別の質問です。

68
Stefan

サーバーが同じ端末で起動されている場合、おそらく端末に書き込まれているのはサーバーのstderrであり、キャプチャしていないものです。

すべてをキャプチャする最良の方法は、実行することです。

script output.txt

サーバーまたはクライアントを起動する前に。これにより、すべてのターミナル出力がoutput.txtとターミナルにリダイレクトされた新しいシェルが起動します。次に、その新しいシェル内からサーバーを起動してから、クライアントを起動します。画面に表示されるすべてのもの(そのシェル内から端末に書き込むすべての入力と出力の両方)がファイルに書き込まれます。

完了したら、「exit」と入力して、scriptコマンドによって実行されたシェルを終了します。

56
Brian Campbell

この構文を使用して、すべての出力stderrおよびstdoutをstdout.txtにリダイレクトできます。

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

POSIXではありませんが、bash 4には&>演算子があります。

command &> alloutput.txt

52

サブシェルを実行して、プロセスをバックグラウンドで実行しながらすべての出力をリダイレクトできます。

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

クラッシュするプログラムで問題が発生しました* coughPHPcough *実行されたシェルがクラッシュすると、クラッシュの理由、Segmentation fault (core dumped)を報告します

この出力がログに記録されないようにするには、これらの種類の出力をキャプチャして送信するサブシェルでコマンドを実行できます。

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

適切な答えはこちらです: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html

your_command | ssh username@server "cat > filename.txt"
2
Morlock