Bashがプロンプトを書き込むストリームはどれですか?


8

bashからのすべての出力(プロンプト、ユーザー入力、結果)をファイルにリダイレクトしようとしています

例:

/bin/bash > file.txt 2>&1

私はそれでうまくいくと思っていましたが、プロンプトが出ません。誰かが私が間違っていることを教えてもらえますか?

回答:


9

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を出力します。プロンプトと同様に、出力は直接ターミナルに送信されます(ターミナルがない場合は失敗します)。

ヒント:すべてを収集したい場合は、


潜在的にパイプによりbashの出力を取得する方法について追加しましたヒント
sehe

seqは非常に非標準の外部コマンドであり、この方法で使用しないでください。を使用している場合はbash、のようfor x in {1..10}にするか、for ((x=1; x<=10; x++))代わりに。
クリスダウン

@クリス:良い点、ヘッドアップのためのおかげで
sehe

2

だまして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
)

2

それを行う最も簡単な方法は

bash -i >/tmp/logfile 2>&1

Bashはすべてを書き込み/tmp/logfile、コマンドを入力しながら実行し続けますが、ターミナルには何も表示されません。端末セッションを終了するときと同じように、Ctrl+ を押すDか入力して終了することができますexit

stderrリダイレクトせずに同じことを実行すると、グリーティングメッセージのみがファイルに記録され、残りはすべて現在の端末で機能することに注意してください。したがって、bashがプロンプトを出力するストリーム(および次のすべてのコマンド)に関する質問への回答は、stderrのようです。

ああ、そう-iです。このパラメーターは、bashを対話モードで実行するように強制するだけです。それらの人々の話を聞いてはいけません-それをするのに魔法のトリックは必要ありません;)


<sub>フォーマットに使用する場合は+1 。今日は新しいことを学びました。:D
クリスK

2

プロンプトは、トラス(ここでは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.