1

どこかで読んだ後、実行中のシェルスクリプトの絶対物理パスを取得するためにこの手法を使用しています(場所は覚えていません)。

cd $(dirname "$0") && ABSPATH=$(pwd) && cd - > /dev/null

スクリプトが絶対パスまたは相対パスから呼び出されるかどうかに関係なく、完全に機能するはずです。つまり、、、、、、別script.shのスクリプト内からなど./script.shです。../script.sh../../../lib/script.sh/Users/../scripts/script.sh

実際、この手法は、相対パスを絶対化するためのかなり堅実なパターンのようです。

これを行うための多くの手法が、何らかの理由で、あるシステムまたは別のシステムでは機能しない傾向があることを私は知っています。では、この手法との互換性の問題はありますか? ほとんどすべての Unix OS とシェルで動作するはずですか、それとも潜在的な問題はありますか?

4

2 に答える 2

0

潜在的な問題の 1 つは、シンボリック リンクをたどらないことです (つまり、"$0"実際にスクリプトへのシンボリック リンクである場合、スクリプトを含む実際のディレクトリではなく、シンボリック リンクを含むディレクトリを取得します)。

もう 1 つは、必ずしも信頼できるとは限らないことです"$0"。たとえば、スクリプトがexec関数の 1 つによってロードされている場合、任意の文字列を に渡すのは簡単ですargv[0]。代わりに使用"$BASH_SOURCE"しますが、これは明らかに bash 固有のものです。

"s around が欠けている$(dirname "$0")ため、ディレクトリ名にスペースが含まれている場合などは機能しません。

これにより、次の問題が修正されると思います。

cd "$(dirname "$(readlink -e "$BASH_SOURCE")")" && ABSPATH=$(pwd) && cd - > /dev/null
于 2012-06-11T23:26:45.570 に答える
0

私もこれに絶えず苦労しているようです。readlink -f|e がすべてのプラットフォームでサポートされていないのは残念です...

以下は機能し、移植可能です。相対およびネストされたシンボリックリンクをサポートしています(したがって、ディレクトリに入る while ループ.

path="${BASH_SOURCE[0]}" current="$PWD"
while [ -L "$path" ] ; do cd "$(dirname "$path")" ; path="$(readlink "$(basename "$path")")"; done
ABSPATH="$( cd "$(dirname "$path")" ; pwd -P)"
cd "$current"

大量のフォークが進行中であり、それはワンライナーではないため、理想的またはエレガントなソリューションとは考えていません...しかし、ここではインターウェブ用であり、時間の経過とともに改善できるかどうかを確認します.

過去に、次のパターンを使用しました (絶対シンボリック リンクで機能します)。

local path="${BASH_SOURCE[0]}"
while [ -L "$path" ] ; do path="$(readlink "$path")" ; done
ABSPATH="$( cd "$(dirname "$path")" ; pwd -P)"

しかし、今では主に使用しています

ABSPATH="$( cd "$(dirname "${BASH_SOURCE[0]}")/.." ; pwd -P)"
于 2021-06-17T21:50:28.023 に答える