web-dev-qa-db-ja.com

シンボリックリンクを介して実行されたときに現在のスクリプトのパスを取得します

いくつかの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を確実に参照するにはどうすればよいですか?

59
Mike Deck

これを汎用ソリューションとして試してください。

DIR="$(cd "$(dirname "$0")" && pwd)"

以下のシンボリックリンクの特定のケースでは、これを行うこともできます:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

1行:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

readlink -fは機能しません。私はこの間違いを犯しました。

readlink: illegal option -- f
usage: readlink [-n] [file ...]

しかし、これはうまくいきます:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

上記のスクリプトへの小さな追加。 pwdの-Pオプションはシンボリックリンクに従います

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420