2016-07-21 8 views
3

関数が完了するまでに時間が掛かり、機能が配置されている場所を探して、ファイルの場所を編集して関数を自分自身で観察できるようにします。彼は関数本体をシェルに表示することを望みません。関数を含むスクリプトファイルのパスを取得するだけです。私たちのヒッチハイカーは、彼の関数の名前を知っているだけです。answer_lifeです。名前からbash関数のパスを取得する

、次のように定義された、彼はファイルuniversal-questions.sh内の機能を持っている私たちのヒッチハイカーに知らされていないのパスを想像:

function answer_life() { 
    sleep $(date --date='7500000 years' +%s) 

    echo "42" 
} 

hitchhiker-helper-scripts.shと呼ばれる別のスクリプトは、以下に定義されます。それはsource上記の関数は「その中にdを持っている(。ただ、ボールをプレー、私は推測する、ヒッチハイカーはどちらかsourceを理解していない。):

source "/usr/bin/universal-questions.sh" 

function find_life_answer_script() { 
    # Print the path of the script containing `answer_life` 
    somecommand "answer_life" # Should output the path of the script containing the function. 
} 

あなたが来るどこだからこれは、私の勇敢なスクリプターが、あることができます。コメントを、find_life_answer_scriptのコードで置き換えて、ヒッチハイカーが関数の場所を見つけることができます。拡張デバッグモードで動作してbashで

答えて

4

declare -Fは(調達として)あなたの関数名、行番号、およびパスを与える:

function find_life_answer_script() { 
    (shopt -s extdebug; declare -F answer_life) 
} 

同様:サブを実行

$ find_life_answer_script 
answer_life 3 ./universal-questions.sh 

シェルを使用すると、以前の設定に影響を与えることなくextdebugモードを設定できます。

+0

完璧な答えを。しかし、すぐに元に戻すために 'shopt'を切り替える大きなファンではありません。それが避けられれば、私はそれを好むだろう。あなたの答えをありがとう! –

+2

サブシェルで実行することで 'shopt'トグルを避けることができます。これには、既存の 'extdebug'設定に影響を与えないという利点があります。回答が更新されました。 – bishop

+0

素晴らしいアイデア!もし私ができれば2倍upvote、ありがとう。答えに対する優れた解説もbtwを編集します。 –

1

あなたのヒッチハイカーも答えにこの方法を見つけることを試みることができます:

script=$(readlink -f "$0") 

sources=$(grep -oP 'source\s+\K[\w\/\.]+' $script) 

for s in "${sources[@]}" 
do 
    matches=$(grep 'function\s+answer_life' $s) 
    if [ -n "${matches[0]}" ]; then 
    echo "$s: Nothing is here (" 
    else 
    echo "$s: Congrats! Here is your answer!" 
    fi 
done 

デバッグモードがいくつかの地球上で使用できなくなります場合、これはケースのためである)

+0

これはかなりいい答えです!インストールとパッケージではうまく動作しますが、私が実行した1回のテストでは失敗しました(残念なことにソースファンクションでも)。明らかに、もし私のヒッチハイカーが、最も近い 'apt'サーバ¯\_(ツ)_ /¯ –

関連する問題