bash関数を定義するファイルを見つける方法は?

bash関数を定義するファイルを見つける方法は?

bash関数が定義されたファイルを見つける方法がわかりません(__git_ps1私の場合)。

declaretype試してみましたが、whichソースファイルを教えてくれませんでした。declareファイル名と行番号を印刷できることをどこかで読みましたが、方法は説明されていません。helpページdeclareには何も言いません。

この情報をどのように取得できますか?

答え1

関数を実行する準備ができたら、set -xトレースの実行とPS4変数の設定で情報を取得できます。

  1. bashを起動するか、--debuggerそれを使用して追加のshopt -s extdebugデバッグ情報を記録します。

  2. Set PS4、ソース行を表示するために追跡すると、「ヒント」が印刷されます。

  3. 追跡をオンにします。

  4. その後、関数を実行し、各行ごとに関数のファイル名を取得できます。

  5. set +xトレースをオフにするために使用されます。

したがって、この場合は以下を実行します。

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x

答え2

関数を実行したくない場合でも、デバッグを設定して情報を取得できます。ステップは次のとおりです

  1. 関数を定義する前bash --debuggerまたは先頭にあります。shopt -s extdebug
  2. declare -F __git_ps1

関数が定義された場所を報告します。

注釈付き実行トレースを表示するためにPS4を使用することと比較して、このアプローチの利点は次のとおりです。

  • 出力がはるかに少ない。
  • 質問に直接回答しました

実行トレースの利点は次のとおりです。

  • 呼び出されたすべての関数を即座に確認する
  • 呼び出し関数間の関係の表示
  • 再帰参照

強くshopt -s extdebug2つから始めて、異なるコンテンツを扱うことをお勧めします~/.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 構成ファイルに入れる必要があるかもしれません。また、犯人を見つけたら変更を元に戻すことを忘れないでください。

関連情報