.bashrcの関数の代わりに通常の文字列コマンドを使用することの意味(特にPROMPT_COMMANDとPS1の場合)

.bashrcの関数の代わりに通常の文字列コマンドを使用することの意味(特にPROMPT_COMMANDとPS1の場合)

理解するのが難しいです。

  • どのように解析されますか.bashrc
  • Bash関数の設定方法

端末プロンプトをカスタマイズしようとしています。使用方法.bashrcは次のとおりですPROMPT_COMMAND(実際にははるかに複雑です)。

function prompt_command {
    PS1="-> "
}

PROMPT_COMMAND=prompt_command

このソリューションは、ファイルの外側に隠す必要があるシェルの名前空間を複雑にするので気に入りません(ただし、プロンプトが中断されるためprompt_command使用できません)。unset

そこで、PROMPT_COMMAND次のようにプレーンテキストを設定することもできることがわかりました。

PROMPT_COMMAND='PS1="-> "'

私が言ったように、私のプロンプトコマンドは実際にはるかに複雑です。したがって、私はこの選択肢の効率を懸念しています。

.bashrc2つの方法が機能的に同じであっても、my構文解析とプロンプトコマンドの設定方法に根本的な違いはありますか? Bashは関数オブジェクトとして効果的に「コンパイル」して「キャッシュ」できますかprompt_command?それとも、文字列を解析するのと同じように、新しいシェル行ごとにそれらを解析しますか?

ベストアンサー1

.bashrc新しい端末セッションが開始されるたびに、ファイルは一度だけ解析されます。

解析中に関数はprompt_command環境変数に追加されますが、「コンパイル」ステップもなく、「オブジェクト」としても構成されません。Bashはシングルパス通訳の言語です。

端末に新しい行が入力されると実行され、PROMPT_COMMAND環境変数からそれを効果的に検索しprompt_command(シェルに入力するのと同じ方法でprompt_command)、1行ずつ実行されます。したがって、アクションはコマンドを直接割り当てるのと似ていますPROMPT_COMMAND。直接割り当ては環境変数を取得する必要がないため、(無意識的に)より速くする必要があります。

おすすめ記事