Bash: プロンプトとタイトルを設定するための PS1 と Prompt コマンド

Bash: プロンプトとタイトルを設定するための PS1 と Prompt コマンド

プロンプトとターミナルタイトルを設定する場合のパフォーマンス/効率に関して、次のオプションに大きな違いはありますか? ( への追加の呼び出しは別としてecho)

  1. PS1 をコマンドの出力に設定します。
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. PS1を直接設定するために使用しますPROMPT_COMMAND:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
    PS1="my prompt"
}

答え1

効率:

  • PS1="$(fun)"関数を呼び出す一度だけ(割り当てが解析されるとき) サブシェル プロセスが使用されます。出力が完全に静的である場合、これは最も効率的なオプションです。
  • PROMPT_COMMAND=fun関数を呼び出す毎回(プロンプトが表示されるたびに) メイン シェル プロセス内で実行されます。
  • PS1="\$(fun)"関数を呼び出す毎回(プロンプトが表示されるたびに) サブシェル プロセスが毎回生成されるため、PROMPT_COMMAND よりも効率が低くなります (ただし、必要な場合もあります。次のセクションを参照してください)。

正確性:

  • の内容はPS1Readline に提供され、プロンプトの幅を認識し、入力が 1 行に収まらなくなった場合に入力を適切に折り返すことができます。PS1 から関数を呼び出す場合 (例) 、通常の および の代わりに、非表示のシーケンスをおよびPS1="\$(foo)"で折り返す必要があります。\001\002\[\]
  • の結果はPROMPT_COMMAND画面に直接表示され、Readline には認識されません。このメソッドを排他的に使用しようとすると (つまり、空の と一緒に使用する場合PS1="")、入力が 1 行より長くなるとすぐにカーソルが意味をなさなくなり、2 行目から 1 行目へのバックスペースができなくなることに気付くでしょう。
  • 複数行のシェルプロンプトの場合、前の行がどのように表示されるかは関係ありません。最後線はまだ透けて見えますPS1
  • また、ターミナルのタイトルの設定に何を使用するかは重要ではありません。これは、プロンプトの幅にはカウントされないためです。

関連情報