$(dirname "$BASH_SOURCE")
を信じます あなたが調達しているファイルがない限り、あなたが望むことをします シンボリックリンク。
参照しているファイルがシンボリック リンクである可能性がある場合は、次のようにして実際のディレクトリを取得できます:
PRG="$BASH_SOURCE"
progname=`basename "$BASH_SOURCE"`
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
dir=$(dirname "$PRG")
エレガントな解決策は次のとおりです。
script_path="${BASH_SOURCE[0]}"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
ただし、これはリンクを調達する場合には機能しません。その場合、そうするかもしれません
script_path="$(readlink -f "$(readlink "${BASH_SOURCE[0]}")")"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
注意事項:
${array[x]}
のような配列 は POSIX 準拠ではありませんが、BASH_SOURCE
とにかく、配列はBashでのみ利用可能です- macOS では、ネイティブ BSD
readlink
-f
をサポートしていません 、そのため、GNUreadlink
をインストールする必要がある場合があります 例を使用してbrew install coreutils
で醸造readlink
を置き換えますgreadlink
で - ユースケースによっては、
-e
を使用したい場合があります または-m
-f
の代わりに切り替えます さらにおそらく-n
;詳細については、readlink の man ページを参照してください
問題に対する別の見方-「。」を使用している場合。環境変数を設定するために、これを行うもう 1 つの標準的な方法は、スクリプトに変数設定コマンドをエコーさせることです。例:
# settings.sh
echo export CLASSPATH=${CLASSPATH}:/foo/bar
次に、出力を評価します:
eval $(/path/to/settings.sh)
それがモジュールのようなパッケージがどのように機能するかです。この方法により、sh (X=...; export X
) から派生したシェルのサポートも容易になります。 ) および csh (setenv X ...
)