3 回答
TA贡献1848条经验 获得超2个赞
尝试以下简单的一线:
对于所有UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
重击
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
注意:命令中使用双破折号(-)表示命令选项的结尾,因此包含破折号或其他特殊字符的文件不会破坏命令。
注意:在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中,您可以使用Parameter Expansions来实现,例如:
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"
}
- 3 回答
- 0 关注
- 763 浏览
添加回答
举报