bash関数が定義されたファイルを見つける方法がわかりません(__git_ps1
私の場合)。
declare
、type
試してみましたが、which
ソースファイルを教えてくれませんでした。declare
ファイル名と行番号を印刷できることをどこかで読みましたが、方法は説明されていません。help
ページdeclare
には何も言いません。
この情報をどのように取得できますか?
答え1
関数を実行する準備ができたら、set -x
トレースの実行とPS4
変数の設定で情報を取得できます。
bashを起動するか、
--debugger
それを使用して追加のshopt -s extdebug
デバッグ情報を記録します。Set
PS4
、ソース行を表示するために追跡すると、「ヒント」が印刷されます。追跡をオンにします。
その後、関数を実行し、各行ごとに関数のファイル名を取得できます。
set +x
トレースをオフにするために使用されます。
したがって、この場合は以下を実行します。
bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x
答え2
関数を実行したくない場合でも、デバッグを設定して情報を取得できます。ステップは次のとおりです
- 関数を定義する前
bash --debugger
または先頭にあります。shopt -s extdebug
declare -F __git_ps1
関数が定義された場所を報告します。
注釈付き実行トレースを表示するためにPS4を使用することと比較して、このアプローチの利点は次のとおりです。
- 出力がはるかに少ない。
- 質問に直接回答しました
実行トレースの利点は次のとおりです。
- 呼び出されたすべての関数を即座に確認する
- 呼び出し関数間の関係の表示
- 再帰参照
私強くshopt -s extdebug
2つから始めて、異なるコンテンツを扱うことをお勧めします~/.bashrc
。~/.bash_profile
文書他の用途に使用祈るケース。
答え3
では不可能に見えますが、bash
以下では可能ですzsh
。
$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh
答え4
同じ名前の関数を宣言し、できるだけ早く読み取り専用にし、次のようにxtraceモードを有効にします。
__git_ps1(){ :;}
readonly -f __git_ps1
set -x
後でログインすると、ファイルソースを含むトレース情報が表示されます。既存の読み取り専用関数を宣言しようとすると、エラーメッセージが表示されます。上記の最後のソースファイルには、探している宣言が含まれている必要があります。
これをシステム bash 構成ファイルに入れる必要があるかもしれません。また、犯人を見つけたら変更を元に戻すことを忘れないでください。