シェルスクリプトを開発するのはなぜそれほど難しいのですか? NodeJSでは簡単に次のことができます。
require('./script')
そして常にscript
現在のスクリプトに基づいている必要があります。しかし、シェル/バッシュで試してみると:
./script.sh
cwd
()にpwd
関連するスクリプトを見つけます。予想通り、ドットは現在のスクリプトがあるディレクトリではなくcwd
()を意味するようです。pwd
line 8: ./script.sh: No such file or directory
スクリプトが現在実行されているディレクトリに基づいてスクリプトを実行するには?
頑張りました
/bin/bash script.sh
しかし、エラーが発生します。
/bin/bash: script.sh: No such file or directory
それから試しました。
script.sh
このエラーが発生します
line 8: script.sh: command not found
次の回避策だけが正常に動作しますが、問題は読めないことです。
$("$(dirname "$(realpath "$0")")/script.sh")
答え1
スクリプトディレクトリを取得する別の変形:
DIR="$(cd "$(dirname "$0")" && pwd)"
その後、スクリプトを呼び出すことができます。
$DIR/script.sh
答え2
残念ながら、そうする必要があります。
(私が好む)もう一つの方法は、次のようにスクリプトの先頭の現在のディレクトリにcdすることです。
cd $(dirname $0)
答え3
他の答えが示すように、あなたのソリューションは正しいです。
他の回答からわかるように、スクリプトディレクトリを一度インポートして複数回使用できます。これはよりクリーンで効率的です。
他の答えが示すように、おそらく必要はありません
realpath
。なぜ必要だと思いますか?あなたのソリューションに追加量があるようです
$(
。)
"$(dirname "$(realpath "$0")")/script.sh"
それで十分でしょう...
…誰も指摘していない非常に微妙なケースがあるという点を除けば。他の答えを均質化してみましょう。
DIR="$(dirname "$(realpath "$0")")" "$DIR"/script.sh
「現在のスクリプト」がルートディレクトリにあり(例:)、効果がないと仮定すると、それが
/first_script
得られます。realpath
DIR="/"
"$DIR"/script.sh
行は次に展開されます。
"/"/script.sh
つまり、
//script.sh
これは通常同じです
/script.sh
が、Unix(POSIX)は処理する権利を留保します。//
最初に特にパス名。無限に安全です。DIR="$(dirname "$(realpath "$0")")"/ "$DIR"/script.sh
/
定義の末尾に(追加、明示的)がありますDIR
。そうで$0
あれば、はに設定されて展開されます。つまり/first_script
、DIR
//
"$DIR"/script.sh
///script.sh
保証すると同じです/script.sh
。$0
たとえば、より一般的な項目/foo/bin/first_script
の場合は、DIR
に設定されて展開され/foo/bin/
ます。"$DIR"/script.sh
/foo/bin//script.sh
保証する/foo/bin/script.sh
.