シンボリックリンクを介して実行すると、現在のスクリプトへのパスを取得します。

シンボリックリンクを介して実行すると、現在のスクリプトへのパスを取得します。

私は、複数のコンピュータに展開されるサポートファイルといくつかの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")")"

おすすめ記事