
私は、複数のコンピュータに展開されるサポートファイルといくつかの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
答え1
一般的な回避策として、次を試してください。
DIR="$(cd "$(dirname "$0")" && pwd)"
特定のシンボリックリンクに対してもこれを行うことができます。
DIR="$(dirname "$(readlink -f "$0")")"
答え2
一行:
cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
答え3
readlink -f
私にとってはうまくいきません。次のエラーが発生します。
readlink: illegal option -- f
usage: readlink [-n] [file ...]
しかし、これはうまくいきます。
DIR="$(dirname "$(readlink "$0")")"
echo $DIR
答え4
上記のスクリプトにいくつかの追加があります。 pwdの-Pオプションはシンボリックリンクに従います。
DIR="$(cd "$(dirname "$0")" && pwd -P)"