PS3およびPS4プロンプト変数の奇妙な動作

PS3およびPS4プロンプト変数の奇妙な動作

プロンプトをカスタマイズすることが可能であることがわかります(例: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定義いいえ他のプロンプト文字列と同じ方法で拡張することを宣言します。表示される動作はマニュアルと一致します。

関連情報