Bash:スクリプトで実行対ソースを検出しますか?


19

適切な操作のためにシェル内にある必要があるいくつかのグローバル環境変数(LD_LIBRARY_PATH、PATH、ROOTDIRなど)を設定するファイルシステム(ビルドプロセスの副作用)に散らばっているスクリプトがあります。もちろん、それは私がそれを動作させる必要がある、source script.shまたは動作. script.shさせないことを意味します./script.sh(新しいシェルを生成し、現在のシェルに変数を設定しません)。

実行中のユーザーを防ぐ(または警告する)ためにスクリプトに追加できるものはあり./script.shますか?

回答:


15

シェルスクリプトで$0は、現在実行中のスクリプトの名前です。これを使用して、次のようにソースされているか実行されているかを確認できます。

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

最も簡単な方法bashは次のとおりです。

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE 常にスクリプトの名前/パスが含まれます。

$0 ソースされていない場合、スクリプトの名前/パスのみが含まれます。

そのため、一致する場合、スクリプトはソースされていません。



1

別のオプションは、実行権限を削除することです。その場合、実行することはできませんが、それでもソースを取得できます。


1
これは不完全です。スクリプトbash scriptの実行フラグに関係なく、スクリプトを実行できます。また、Cygwinで(このカウントはカウントしますか?)実行フラグを削除することはできません。
ティノ

0

$ 0(チェックに加えてミケルの答えを)例えば、.SRCに.SHから拡張子を変更することが有用であり得ます。このスクリプトを実行してはならない人を理解するのに役立ちます。


0

カスタムインタープリターを作成しますsource_reminder

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

実行可能にすることを忘れないでください。次に、スクリプトで使用します。

#!/path/to/your/source_reminder
foo
bar
whatever

ここで、ソースなしでスクリプトを実行すると、リマインダーが機能します。


ナイスキャッチ。 #!/bin/echo do not executeまたは#!/bin/falseまたは#!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }。ただし、これは次のようなスクリプトで実行される場合をキャッチしませんsh script(これはシバンを無視するため)。
ティノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.