Bash 2つのシェルプロンプトを作成しますか?

Bash 2つのシェルプロンプトを作成しますか?

トレーニング目的で端末に接続されている実行中のbashプロセスのstrace出力を見ています。

私のbashプロセスのPIDは2883です。

私は入る

[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace

端末を入力します。次に、bashプロセスに入り、次の対話を実行します。

[OP@localhost ~]$ ls

出力を見るとわかります。

strace: Process 2883 attached
read(0, "l", 1)                         = 1
write(2, "l", 1)                        = 1
read(0, "s", 1)                         = 1
write(2, "s", 1)                        = 1
read(0, "\r", 1)                        = 1
write(2, "\n", 1)                       = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22)  = 22
...

最後の2行が混乱しています。 bashが2つのシェルプロンプトを作成しようとしていると思いますか?ここで何が起こっているのでしょうか?

答え1

この<ESC>]0;シーケンス(straceで表示\33]0;)は、ターミナルウィンドウのタイトルを設定するエスケープシーケンスです。 BEL文字()で終わるため、\7最初の文字はwriteウィンドウのタイトルを設定します。 2番目は実際のプロンプトを印刷します。エスケープシーケンス以外は同じではありません。プロンプトにはサラウンドがありますが、[..]ウィンドウのタイトルにはありません。

write()stdoutへの最初の書き込み(fd 1、最初のパラメータ)とstderrへの2番目の書き込みも表示されます。 Bashはプロンプトをstderrに印刷するので、最初の書き込みは他の場所で行われます。おそらく、PROMPT_COMMANDDebianのBashの基本的な起動スクリプトにあるものと同じどこかにあります。その中には次のような内容があります。

case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
    ;;
*)
    ;;
esac

またはPROMPT_COMMAND実行している場合は設定され、対応するエスケープシーケンスをサポートする必要があります。xtermrxvt

関連情報