Bashで呼び出し側関数を呼び出す方法を取得する方法

Bashで呼び出し側関数を呼び出す方法を取得する方法

$caller_method以下のコードに基づいて、関数呼び出し者が通常関数を呼び出したかどうか(たとえば、擬似コード関数でmytest 1サブシェルスタイルを使用するなど)の値を取得できますかecho "(mytest 1)"

#!/bin/bash
function mytest() {

      # THIS IS PSEUDOCODE
      if $caller_method=directly; then
         echo "THIS WAS CALLED DIRECTLY"
         # Do other stuff
      elif $caller_method=inside_a_subshell; then
         echo "THIS WAS CALLED INSIDE A SUBSHELL"
         # Do other stuff
      fi
     # END OF PSEUDOCODE
}
    
    # CALLER 
    # Calling mytest directly
    mytest 1
    # Calling mytest inside a subshell
    echo "$(mytest 1)"

予想出力:

THIS WAS CALLED DIRECTLY
THIS WAS CALLED INSIDE A SUBSHELL

もしそうなら、mytest()関数はこのmytest 1メソッドを使用して呼び出されるかどうかに関係なく情報を理解または保存できますか$(mytest 1)

$(mytest 1 call_inside_a_subshell)また、呼び出し側関数から、または同じ追加パラメータを渡したくありません。mytest 1 call_directly

ベストアンサー1

組み込み変数を使用してサブシェルに存在するかどうかを検出する方法に関するこの質問を見つけました。$BASHPID サブシェルにいるかどうかはどうすればわかりますか?

したがって、コードは次のように書くことができます。

#!/bin/bash

function mytest()
{
    if [ "$$" -eq "$BASHPID" ]; then
        echo "THIS WAS CALLED DIRECTLY"
    else
        echo "THIS WAS CALLED INSIDE A SUBSHELL"
    fi
}

# Calling mytest directly
mytest 1
# Calling mytest inside a subshell
echo "$(mytest 1)"

おすすめ記事