bashシェルスクリプトで実行コードとソースコードを区別しますか?

bashシェルスクリプトで実行コードとソースコードを区別しますか?

私がここに尋ねるのは、非常に不慣れである、またはフレームワークに縛られていない、危険である、または私のGoogle技術が単にレベルに達していないことです。

シェルスクリプトでbash他のシェルスクリプトによって選択されたのか、それともそれ自体で実行されたのかを簡単に知る方法はありますか?つまり、次の2つの行為を区別することは可能ですか?

# from another shell script
source myScript.sh

# from command prompt, or another shell script
./myScript.sh

私が考えているのは、bashソースコードをインポートするときに使用できる機能を含むユーティリティに似たシェルスクリプトを作成することです。ただし、スクリプトが独自に実行されるときに定義された関数に基づいてタスクを実行したいと思います。このシェルスクリプトがある種の環境変数を取得することは可能ですか?

some_function() {
    # ...
}
if [ -z "$IS_SOURCED" ]; then
    some_function;
fi

好ましくは、フラグ変数を設定するために呼び出し側スクリプトを必要としない解決策を探している。

編集する:スクリプトを受け取るものとスクリプトを実行することの違いを知っています。可能であれば、ここで何を知りたいです。違いを教えてください使用されるスクリプトでは(2つの方法で)。

ベストアンサー1

はい - $ 0変数は実行時にスクリプト名を提供します。

$ cat example.sh
#!/bin/bash
script_name=$( basename ${0#-} ) #- needed if sourced no path
this_script=$( basename ${BASH_SOURCE} )
if [[ ${script_name} = ${this_script} ]] ; then
    echo "running me directly"
else
    echo "sourced from ${script_name}"
fi 

$ cat example2.sh
#!/bin/bash
. ./example.sh

次のように実行します。

$ ./example.sh
running me directly
$ ./example2.sh
example.sh sourced from example2.sh

これはインタラクティブシェルからソースコードを取得するのに実際には適していませんが、アイデアは得られます(希望)。

BASH_SOURCEを含めるように更新されました。ありがとうございます。

おすすめ記事