関数がこのように動作するかどうかはわかりますか? "${@}"

関数がこのように動作するかどうかはわかりますか? "${@}"

ここに私の単純化されたスクリプトがあります。

私はproc()が直接実行されているのかランナーを介して実行されているのかを知ることができるかどうか疑問に思います。

#!/bin/bash
runner () {
    "${@}"
}
proc() {
    eval 'version=$(echo "SUCCESS: **** ${BASH_VERSION} ****")'
    echo -e "$version"; 
    return 0
}

runner proc
proc

どう思いますか?

答え1

procあなたの例では別々のプロセスではありません。これはメインシェルと同じプロセスで実行される関数です。

この$FUNCNAME配列を使用すると、バックトレースにアクセスできます。

foo(){ bar; }
bar(){ baz; }
baz(){ proc; }
proc(){ echo "${FUNCNAME[@]}"; }

$ foo
proc baz bar foo main

はい。以下が可能です。

case ${FUNCNAME[1]} in runner) ...

試してみると、サブシェル/サブプロセスで実行してもトレースバックが壊れたり、何の影響も与えないことがわかります。

foo(){ (bar &) | cat; }
=> same output

関連情報