次の簡単なワンライナーを試してください:
すべてのUNIX / OSX / Linuxの場合
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
バッシュ
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
注:コマンドでは、2つのダッシュ(-)を使用してコマンドオプションの終わりを示します。そのため、ダッシュやその他の特殊文字を含むファイルはコマンドを中断しません。
注:Bashではを使用${BASH_SOURCE[0]}
してください。$0
そうしないと、ソース(source
/ .
)を取得するときにパスが壊れる可能性があります。
Linux、Macおよびその他の* BSDの場合:
cd "$(dirname "$(realpath "$0")")";
注:realpath
デフォルトで最も人気のあるLinuxディストリビューション(Ubuntuなど)にインストールする必要がありますが、インストールされていない場合があるため、インストールする必要があります。
注:Bashを使用${BASH_SOURCE[0]}
している場合はを使用してください。$0
そうしないと、ソース(source
/ .
)を取得するときにパスが壊れる可能性があります。
そうでなければ、あなたはそのようなものを試すことができます(最初の既存のツールを使用します):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Linux固有の場合:
cd "$(dirname "$(readlink -f "$0")")"
* BSD / MacでGNU readlinkを使用:
cd "$(dirname "$(greadlink -f "$0")")"
注:coreutils
インストールが完了している必要があります(例1. Homebrewをインストールする、2。brew install coreutils
)。
バッシュで
bash では、次のように、パラメータ拡張を使用してそれを実現できます。
cd "${0%/*}"
ただし、スクリプトが同じディレクトリから実行されている場合は機能しません。
または、bashで次の関数を定義できます。
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
この関数は1つの引数を取ります。引数にすでに絶対パスがある場合はそのまま出力し、そうでない場合は$PWD
変数+ファイル名の引数を出力します(./
プレフィックス)を出力します。
または、Debian .bashrc
ファイルから取得したバージョンは次のとおりです。
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
関連:
以下も参照してください。
MacでGNUのreadlink -fの動作を取得するにはどうすればよいですか?