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


59

いくつかの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

回答:


80

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

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

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

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

完璧に機能し、私が試していたものよりもずっと簡単です。ありがとう!
マイクデッキ

@MikeDeckお楽しみください。最初の投稿以降の引用の問題を修正したことに注意してください...パスにスペースやその他の奇抜な文字が含まれている場合は、最新の編集のオプションを使用することがあります。このプロジェクトにとって重要ではない場合でも、独自のスクリプトからコードをコピーして、最適なオプションを選択することができます。
カレブ

1
明確にする必要があります、2番目は完全に機能します。あなたが与えた最初の解決策は、私のシステム上のシンボリックリンクでは機能しません。
マイクデッキ

4
@MikeDeck:最初の解決策は、パスの一部としてさまざまなディレクトリがシンボリックリンクされている典型的なケースで機能しますが、最終的なバイナリがシンボリックリンクである場合は役に立ちません。それが、2番目の方法で処理されます。
カレブ

1
スクリプトファイルがsourcedの場合は機能しません(例$ source ./sript.sh)これは両方の場合に機能しますDIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
。– FractalSpace

7

1行:

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

2
通常、1行の回答はあまり役に立ちません。提案されたソリューションをさらにサポートする説明、リンク、またはドキュメントを含めるように回答を拡大することを検討してください。
HalosGhost 14

1
実際に、あなたは全く関係なしシンボリックリンクがない場合、元の答えのREADLINKバージョンはうまく動作しますが、これを行う必要はありません
THESorcerer

3

readlink -f 私にはうまくいきません、私はこの間違いをしています:

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

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

DIR="$(dirname "$(readlink "$0")")"
echo $DIR

3
次に、Macを使用しているのでこれで質問に答えるはずです。
アイザック

はい、私はMacOs @isaacを使用していますが、質問はありません。私は自分の側で動作するコマンドを投稿しました。
ケビンカンピオン

0

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

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

7
これは、シンボリックリンクがディレクトリ構造の一部である場合にのみ機能します。ファイル自体がリンクされている場合は機能しません。
オリバーゴンジャ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.