Bashプロンプトをファイルにリダイレクトするときに奇妙な出力

Bashプロンプトをファイルにリダイレクトするときに奇妙な出力

bashコマンドの標準エラーをファイルにリダイレクトし、bashプロンプトがリダイレクトされました。しかし、ファイルの内容を印刷すると空です。 bashプロンプトはどこに行きましたか?

ビデオ

繰り返しますが、bashのstdoutをファイルにリダイレクトすると、予想されるプロンプトの代わりに出力がリダイレクトされますが、ファイルの内容を印刷するときにプロンプ​​トにもいくつかの文字があります。どのように?

ここに画像の説明を入力してください。

$PS1 と $PROMPT_COMMAND の値:

ここに画像の説明を入力してください。

私に説明してください。

答え1

最初のケースでは、起動時に stderr がファイルに接続されると Bash が非対話モードに切り替わるようです。このモードでは設定されていないため、PS1プロンプトは印刷されません。また、参照された対話モードが$-含まれていないことを図に見ることができます。i

$ bash 2> file.txt
echo ${PS1-unset}
unset
echo $-
hBs

まあ、マニュアルページにもそう出ています。

対話型シェルは、オプションではなく引数(-s指定されていない限り)とオプションなしで-c開始されます。標準入力とエラーは両方とも端子に接続されます。(OK isatty(3))またはこのオプションで始めてください-i。 bashがインタラクティブかどうかをPS1設定し、$-シェルスクリプトまたは起動ファイルがこの状態をテストできるようにします。i

ただし、シェルの起動後にstderrをリダイレクトすると、ファイルにプロンプ​​トが表示されます。そしてあなたが書いたすべての入力:

main$ PS1='\$ ' bash
$ exec 2> file.txt
hello
^D
main$ cat file.txt 
$ echo hello
$ exit

2番目の場合、反転^ Gは、xtermでターミナルウィンドウのタイトルを設定するエスケープシーケンスを終了するために使用されるターミナルベル制御文字をプロンプトします。プロンプトにこのような内容が含まれている可能性があります。たとえば、printf "%q\n" "$PS1"バックスラッシュでエンコードされた特殊文字を含むプロンプトを表示することを確認できます。

Debian には/etc/bash.bashrc次の部分ヘッダー エスケープが含まれています。

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
...

PROMPT_COMMANDプロンプト自体ではなくプロンプト自体にありますが、アイデアは同じです。\033]0;との間の部分が\007タイトルを設定する部分です。

関連情報