現在のスクリプトと同じディレクトリにあるスクリプトを実行するには?

現在のスクリプトと同じディレクトリにあるスクリプトを実行するには?

シェルスクリプトを開発するのはなぜそれほど難しいのですか? 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得られます。realpathDIR="/"

    "$DIR"/script.sh
    

    行は次に展開されます。

    "/"/script.sh
    

    つまり、

    //script.sh
    

    これは通常同じです/script.shが、Unix(POSIX)は処理する権利を留保します。// 最初に特にパス名。無限に安全です。

    DIR="$(dirname "$(realpath "$0")")"/
    "$DIR"/script.sh
    

    /定義の末尾に(追加、明示的)がありますDIR。そうで  $0あれば、はに設定されて展開されます。つまり/first_scriptDIR//"$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.

答え4

回答の改善マイケル・カイル

空白のあるパスを処理するのに問題がありましたが、次のように解決できました。

cd "$(dirname "$0")"

関連情報