私は多くのレガシーシェルスクリプトの魔法が横たわっている環境で働いています。コマンドラインから頻繁に使用されるものの1つは、bash関数です。これは、.bash_profileに含まれる、いくつかのファイルに含まれるいくつかのファイルに含まれるいくつかのファイルから供給されます。5レベルのインクルードを追跡せずに、これらの関数の定義を取得する方法、またはさらに良い定義の場所を取得する方法はありますか?
私は多くのレガシーシェルスクリプトの魔法が横たわっている環境で働いています。コマンドラインから頻繁に使用されるものの1つは、bash関数です。これは、.bash_profileに含まれる、いくつかのファイルに含まれるいくつかのファイルに含まれるいくつかのファイルから供給されます。5レベルのインクルードを追跡せずに、これらの関数の定義を取得する方法、またはさらに良い定義の場所を取得する方法はありますか?
回答:
関数定義を取得するには:
type -a function_name
whence -f function_name
inzsh
fooという名前の関数があると仮定すると、以下のコマンドは、関数の定義の場所を取得します。つまり、関数が定義されているファイルの名前と、そのファイル内で関数が定義されている行番号を取得します。
# Turn on extended shell debugging
shopt -s extdebug
# Dump the function's name, line number and fully qualified source file
declare -F foo
# Turn off extended shell debugging
shopt -u extdebug
私の場合、これらのコマンドの出力は次のとおりです。
foo 32 /source/private/main/developer/cue.pub.sh
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
、現在のシェルの状態を変更せずに効果をローカライズすることをお勧めします:(代わりにのwhichfunc () ( shopt -s extdebug; declare -F "$1"; )
使用に注意してください)。(...)
{...}
bash -x
起動時にbashが実行しているものをダンプします。これにより、より簡単にトレースできるようになります。新しく開いたシェルを終了することを忘れないでください。
script out.txt bash -x
(これも忘れずにexit
)を使用します。
別の方法、私は最近さらに簡単に見つける:
which <functionname>
(これはエイリアスかスクリプトかを表示しますが、エイリアスのソースを追跡しません)
which
BSDやMacのエイリアスに関する情報を提供するとは思わない。また、この質問は関数に関するものであり、which
関数に関する情報は提供しません。