尝试以下简单的单行:
适用于所有UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
注意:命令中使用双短划线( - )表示命令选项的结束,因此包含短划线或其他特殊字符的文件不会破坏命令。
对于Linux,Mac和其他* BSD:
cd $(dirname $(realpath $0))
白色空间支持:
cd "$(dirname "$(realpath "$0")")";
注意:默认情况下,应该在最流行的Linux发行版中安装.bashrc(如Ubuntu),但在某些情况下它可能会丢失,因此您必须安装它。
否则你可以尝试类似的东西(它将使用第一个现有的工具):
cd $(dirname $(readlink -f $0 || realpath $0))
对于Linux特定:
cd $(dirname $(readlink -f $0))
在* BSD / Mac上使用GNU readlink:
cd $(dirname $(greadlink -f $0))
注意:您需要安装.bashrc(例如1.安装Homebrew,2。./)。
在bash中
在bash中,您可以使用参数扩展来实现这一点,例如:
cd ${0%/*}
但如果脚本从同一目录运行,则它不起作用。
或者,您可以在bash中定义以下函数:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
此函数需要1个参数。 如果参数已经是绝对路径,则按原样打印,否则打印.bashrc变量+文件名参数(不带./前缀)。
或者这里是从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"
}
有关:
如何检测我运行shell脚本的当前目录?
从内部获取Bash脚本的源目录
使用OSX的Bash脚本绝对路径
bash脚本可靠的方式获得自己的完整路径?
也可以看看:
如何在Mac上获取GNU的readlink -f的行为?