bash関数の定義を見つける


41

私は多くのレガシーシェルスクリプトの魔法が横たわっている環境で働いています。コマンドラインから頻繁に使用されるものの1つは、bash関数です。これは、.bash_profileに含まれる、いくつかのファイルに含まれるいくつかのファイルに含まれるいくつかのファイルから供給されます。5レベルのインクルードを追跡せずに、これらの関数の定義を取得する方法、またはさらに良い定義の場所を取得する方法はありますか?

回答:



66

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

3
パーフェクト。これをbashrcファイルでbash関数にしただけです。whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
ニール

5
@Neil:それは便利です、ありがとう:サブシェルを使用してshopt、現在のシェルの状態を変更せずに効果をローカライズすることをお勧めします:(代わりにのwhichfunc () ( shopt -s extdebug; declare -F "$1"; )使用に注意してください)。(...){...}
mklement0

これらのコマンドがスクリプトから機能しないのはなぜですか?関数は正しく動作します
-albfan

1
これは受け入れられた答えであるはずです。
解散

11

関数の定義を(それがどこから来たのかではなく)見るには、以下を使用します:

declare -f <functionname>

これはtype -a、ロケールに依存する迷惑なロケールの最初の行を出力しないためより良いと思います~~
-yuyichao

1
与えられたいかなる場所はありませんので、これは、少なくとも質問unasked unaskedへの答えであるここに
アイコノクラスト

6

bash -x起動時にbashが実行しているものをダンプします。これにより、より簡単にトレースできるようになります。新しく開いたシェルを終了することを忘れないでください。


便利なもの; ファイル内のトレースをキャプチャするには、script out.txt bash -x(これも忘れずにexit)を使用します。
mklement0

-2

別の方法、私は最近さらに簡単に見つける:

  which <functionname>

(これはエイリアスかスクリプトかを表示しますが、エイリアスのソースを追跡しません)


2
whichBSDやMacのエイリアスに関する情報を提供するとは思わない。また、この質問は関数に関するものであり、which関数に関する情報は提供しません。
-dbn

そのメモをありがとう。「これ」は、bshではなくzshの関数のみを解決することがわかりました。
ジョシュアゴールドバーグ

2
この答えは下票を招く可能性が高いと思います...場所に関する情報がないため、質問にまったく対処していないようです。
iconoclast

宣言を追跡し、これを使用して、それがエイリアスか関数かを調べ、宣言された構文を知ることが有用であることがわかりました。ただし、@ HairOfTheDogの回答のみがファイルを直接提供するのは事実です。
ジョシュアゴールドバーグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.