いくつかのbashスクリプトを含むいくつかのディレクトリと、各マシンの異なるディレクトリにある複数のマシンに展開されるサポートファイルで構成されるユーティリティがあります。スクリプトは自分自身からの相対パスを参照できる必要があるため、現在実行中のファイルへのパスを取得できる必要があります。
私のスクリプトが直接呼び出されたときに完全に機能するdirname $0
イディオムを知っています。残念ながら、まったく異なるディレクトリからこれらのスクリプトへのシンボリックリンクを作成し、それでも相対パスロジックを機能させたいという要望があります。
全体的な乾燥構造の例は次のとおりです。
/
|-usr/local/lib
| |-foo
| | |-bin
| | | |-script.sh
| | |-res
| | | |-resource_file.txt
|-home/mike/bin
| |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)
/usr/local/lib/foo/res/resource_file.txt
から呼び出されたか、script.sh
から呼び出されたかにかかわらず、/usr/local/lib/foo/bin/script.sh
から~mike/bin/link_to_script
を確実に参照するにはどうすればよいですか?
これを汎用ソリューションとして試してください。
DIR="$(cd "$(dirname "$0")" && pwd)"
以下のシンボリックリンクの特定のケースでは、これを行うこともできます:
DIR="$(dirname "$(readlink -f "$0")")"
1行:
cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
readlink -f
は機能しません。私はこの間違いを犯しました。
readlink: illegal option -- f
usage: readlink [-n] [file ...]
しかし、これはうまくいきます:
DIR="$(dirname "$(readlink "$0")")"
echo $DIR
上記のスクリプトへの小さな追加。 pwdの-Pオプションはシンボリックリンクに従います
DIR="$(cd "$(dirname "$0")" && pwd -P)"