答え1
最初のケースでは、起動時に stderr がファイルに接続されると Bash が非対話モードに切り替わるようです。このモードでは設定されていないため、PS1
プロンプトは印刷されません。また、参照された対話モードが$-
含まれていないことを図に見ることができます。i
$ bash 2> file.txt
echo ${PS1-unset}
unset
echo $-
hBs
まあ、マニュアルページにもそう出ています。
対話型シェルは、オプションではなく引数(
-s
指定されていない限り)とオプションなしで-c
開始されます。標準入力とエラーは両方とも端子に接続されます。(OKisatty(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
タイトルを設定する部分です。