bashは関数の定義を表示できますか?


262

bashでbash関数の定義を表示する方法はありますか?

たとえば、関数を定義したとしましょう foobar

function foobar {
    echo "I'm foobar"
}

後でfoobar実行するコードを取得する方法はありますか?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

回答:


357

を使用しtypeます。foobarたとえば、次のように定義されている場合~/.profile

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

これは何であるかfoobarを調べ、それが関数として定義されている場合declare -f、pmohandrasで説明されているように呼び出します。

関数の本体(コード)だけを出力するには、次のコードを使用しますsed

type foobar | sed '1,3d;$d'

2
@sjsupersumitこの質問では、Bashソリューションを明示的に求めます。
bfontaine 2018

210

関数の定義は、declareを使用してbashで表示できます。例えば:

declare -f foobar

1
要は、ロードされた他のスクリプトファイルで関数が定義されていても機能します。zshでも動作します。
ディエゴ・ニモ

2
使用する場合、非Linuxシステム上の古いシェルで動作しますtypeset -f
Emmanuel

また、function定義が表示されるだけなので、それが必要かどうかを解析する必要はありません。
リバマー2018年


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

foob​​arは関数名です。


4
問題:最初の "}"までしか表示されませんが、定義に "{...}"の入れ子が含まれていて、実際にBashで許可されている場合は、これがすべてではありません。
Destiny Architect

1
関数に波括弧パターンを含むhere-doc / here-stringが含まれている場合も失敗する可能性があります
Cheetah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.