bashからのすべての出力(プロンプト、ユーザー入力、結果)をファイルにリダイレクトしようとしています
例:
/bin/bash > file.txt 2>&1
私はそれでうまくいくと思っていましたが、プロンプトが出ません。誰かが私が間違っていることを教えてもらえますか?
bashからのすべての出力(プロンプト、ユーザー入力、結果)をファイルにリダイレクトしようとしています
例:
/bin/bash > file.txt 2>&1
私はそれでうまくいくと思っていましたが、プロンプトが出ません。誰かが私が間違っていることを教えてもらえますか?
回答:
Bashは対話モードでのみプロンプトを出力します。つまり、通常はターミナル(Linuxでは/ dev / tty)に出力されます。/ dev / stdoutでも/ dev / stdinでもない:)
今はよくわかりませんが、完全に機能するttyがない場合、bashが制限付きのインタラクティブモードを許可することは想像できます。その場合、プロンプトがstdoutに書き込まれることを期待します。私はそれをテストしていません。
概念実証:
(for a in some set of words; do echo $a > /dev/tty; done) 2>&1 > /dev/null
リダイレクトがないかのように、1..10を出力します。プロンプトと同様に、出力は直接ターミナルに送信されます(ターミナルがない場合は失敗します)。
ヒント:すべてを収集したい場合は、
set -o xtrace
(別名set -x
、bash -x
など)の一般的なロギング用のステートメントseq
は非常に非標準の外部コマンドであり、この方法で使用しないでください。を使用している場合はbash
、のようfor x in {1..10}
にするか、for ((x=1; x<=10; x++))
代わりに。
だましてbash
(にもかかわらず、それは対話モードでの思考の中にstdout
端末に送信されていない)あなたはすでに述べたように使用することができますscript
コマンドを。
(
exec 1> >(tee bashlog.txt) 2>&1
script -q /dev/null /bin/bash -l
)
# alternative without script command
(
# bash: no job control in this shell
exec 1> >(tee bashlog.txt) 2>&1
/bin/bash -il
)
それを行う最も簡単な方法は
bash -i >/tmp/logfile 2>&1
Bashはすべてを書き込み/tmp/logfile
、コマンドを入力しながら実行し続けますが、ターミナルには何も表示されません。端末セッションを終了するときと同じように、Ctrl+ を押すDか入力して終了することができますexit
。
stderr
リダイレクトせずに同じことを実行すると、グリーティングメッセージのみがファイルに記録され、残りはすべて現在の端末で機能することに注意してください。したがって、bashがプロンプトを出力するストリーム(および次のすべてのコマンド)に関する質問への回答は、stderrのようです。
ああ、そう-i
です。このパラメーターは、bashを対話モードで実行するように強制するだけです。それらの人々の話を聞いてはいけません-それをするのに魔法のトリックは必要ありません;)
<sub>
フォーマットに使用する場合は+1 。今日は新しいことを学びました。:D
プロンプトは、トラス(ここではSolaris)が示すようにstderrに書き込まれます。
$ truss -ft write -p 10501
10501: write(2, " d", 1) = 1
10501: write(2, " a", 1) = 1
10501: write(2, " t", 1) = 1
10501: write(2, " e", 1) = 1
10501: write(2, "\n", 1) = 1
10521: write(1, " S a t u r d a y , S e".., 46) = 46
10501: Received signal #18, SIGCLD [caught]
10501: siginfo: SIGCLD CLD_EXITED pid=10521 status=0x0000
10501: write(2, " $ ", 2) = 2