理解するのが難しいです。
- どのように解析されますか
.bashrc
? - Bash関数の設定方法
端末プロンプトをカスタマイズしようとしています。使用方法.bashrc
は次のとおりですPROMPT_COMMAND
(実際にははるかに複雑です)。
function prompt_command {
PS1="-> "
}
PROMPT_COMMAND=prompt_command
このソリューションは、ファイルの外側に隠す必要があるシェルの名前空間を複雑にするので気に入りません(ただし、プロンプトが中断されるためprompt_command
使用できません)。unset
そこで、PROMPT_COMMAND
次のようにプレーンテキストを設定することもできることがわかりました。
PROMPT_COMMAND='PS1="-> "'
私が言ったように、私のプロンプトコマンドは実際にはるかに複雑です。したがって、私はこの選択肢の効率を懸念しています。
.bashrc
2つの方法が機能的に同じであっても、my構文解析とプロンプトコマンドの設定方法に根本的な違いはありますか? Bashは関数オブジェクトとして効果的に「コンパイル」して「キャッシュ」できますかprompt_command
?それとも、文字列を解析するのと同じように、新しいシェル行ごとにそれらを解析しますか?
答え1
.bashrc
新しい端末セッションが開始されるたびに、ファイルは一度だけ解析されます。
解析中に関数はprompt_command
環境変数に追加されますが、「コンパイル」ステップもなく、「オブジェクト」としても構成されません。Bashはシングルパス通訳の言語です。。
端末に新しい行が入力されると実行され、PROMPT_COMMAND
環境変数からそれを効果的に検索しprompt_command
(シェルに入力するのと同じ方法でprompt_command
)、1行ずつ実行されます。したがって、アクションはコマンドを直接割り当てるのと似ていますPROMPT_COMMAND
。直接割り当ては環境変数を取得する必要がないため、(無意識的に)より速くする必要があります。