2017-03-10 7 views
2

ファイルがbashから供給されているかどうかをどのように判断しますか?ファイルがbashから供給されていることを検出する方法

これはthis questionと非常によく似ていますが、提示されている解決策はありません。 /bin/bash -c ". ./setup.bash;"あなたが印刷されたメッセージは、「このスクリプトを調達してください実行しないでください。」表示されます:あなたがこれを調達した場合

if [ "$_" == "$0" ] 
then 
    echo "Please source this script. Do not execute." 
    exit 1 
fi 

:たとえば、ソースのファイルsetup.bashを与えられました。

これはなぜですか?

私の最終目標は、私が最終的にやりたいという意味、このソースのファイルに依存しているbashスクリプトを実行することですので、私は、ファイルをこのように調達しています:

`/bin/bash -c ". ./setup.bash; some_command_that_relies_on_setup_dot_bash;"` 

私が直接bashでこれらを実行する場合たとえば:

. ./setup.bash 
some_command_that_relies_on_setup_dot_bash 

ソースファイルにメッセージが表示されません。私は間違って何をしていますか?

答えて

0

$_を使用すると、最後に実行されたコマンドの引数のみを表すため、エラーが発生しやすくなります。

このように代わりBASH_SOURCEをチェックした方がよい:

if [[ "$0" = "$BASH_SOURCE" ]]; then 
    echo "Please source this script. Do not execute." 
fi 

BASH_SOURCE変数は常にあなたがでたりない、それを調達しているかどうかという事実にかかわらず、すなわち./setup.shを実行しているスクリプトの名前を表します。一方$0

は、あなたがそれを直接実行するか、またはあなたがそれをソース際 -bashに等しくするスクリプトの名前を指定できます。

0

のコードをのコードで実行すると、問題を再現できません。

しかし:(変数またはバックアップ${_})あなたはそのチェックの前に任意のコマンドを実行しないであろうことを確認しsince

_($ _、アンダースコア。)シェル起動で、セット環境または引数リストで渡されたときに実行されるシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名に置き換えます。 その後、展開後に前のコマンドの最後の引数に展開されます。また、実行され、そのコマンドにエクスポートされた環境に置かれた各コマンドを呼び出すために使用される絶対パス名にも設定されます。メールをチェックするとき、このパラメータはメールファイルの名前を保持します。

関連する問題