プロンプトをカスタマイズすることが可能であることがわかります(例:6.9 制御プロンプトセクション)、私はしばらくこれをやってきましたが、最近奇妙な動作を見つけました。
次の2つのシナリオを考えてみましょう。
エスケープシーケンスなし
PS1='\$ '
PS2='> '
PS3='#? '
PS4='+ '
エスケープシーケンスの使用
PS1='\[\e[1;34m\]\$\[\e[0m\] '
PS2='\[\e[1;34m\]>\[\e[0m\] '
PS3='\[\e[1;34m\]#?\[\e[0m\] '
PS4='\[\e[1;34m\]+\[\e[0m\] '
したがって、質問は次のようになります。
PS3
印刷される現状のまま、エスケープシーケンスを解釈せずに。PS4
印刷もしません。
私は彼らが以前に効果があったと確信していますが、頻繁に使用しなかったので、彼らがいつ間違って行動したのかわかりません。
技術的な詳細
- オペレーティングシステム:Ubuntu 16.04.4
- シェル:Bash 4.3.48(1) - リリース
- ターミナルエミュレータ:GNOME Terminal 3.18.3 (ただし、仮想端末でも発生)
- 私が知っている限り、システムがインストールされてから(2017-06-09)、Bashのアップデートはありませんでした。
答え1
からman bash
:
PS1 The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string. The default value is ``\s-\v\$ ''.
PS2 The value of this parameter is expanded as with PS1 and used as the secondary prompt string. The default is ``> ''.
PS3 The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The
したがって、何らかの理由で拡張しないことはPS3
文書化された動作です。
PS4
新しい呼び出しで使用できるように変数をエクスポートする必要がありますbash
。そして、追跡オプションを-v
有効にせずに明示的に設定する必要があります。
pse@Mithos:~/.tmp$ export PS4='uuuu: '
pse@Mithos:~/.tmp$ bash -c "set -x; echo foo"
uuuu: echo foo
foo
答え2
bash
マニュアルから:
PS1 The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string. The default
value is ``\s-\v\$ ''.
PS2 The value of this parameter is expanded as with PS1 and used as the secondary prompt string. The default is ``>
''.
PS3 The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays
during an execution trace. The first character of PS4 is replicated multiple times, as necessary, to indicate
multiple levels of indirection. The default is ``+ ''.
PS3
定義いいえ他のプロンプト文字列と同じ方法で拡張することを宣言します。表示される動作はマニュアルと一致します。