【发布时间】:2016-03-01 09:24:44
【问题描述】:
在 bash 脚本中,是否有任何方法可以获取自身的完整路径?
$ source ~/dev/setup.sh
我试过$_、$-、$0...,但都无关紧要。
提前致谢。
【问题讨论】:
标签: bash
在 bash 脚本中,是否有任何方法可以获取自身的完整路径?
$ source ~/dev/setup.sh
我试过$_、$-、$0...,但都无关紧要。
提前致谢。
【问题讨论】:
标签: bash
$_ 变量用于定位源脚本。如果您要获取脚本,则可以使用 $_ 访问脚本名称(因为 $0 将是 bash 解释器)
bash解决方案。relname="$_";
# if script is in current directory, add ./
if [[ ! "$relname" =~ "/" ]]; then
relname="./$relname"; fi
relpath=`dirname $relname`;
name="${relname##*/}"
# convert to absolute path by cd-ing and using pwd.
cd "$relpath" >/dev/null;
path=`pwd`;
cd - >/dev/null;
# construct full path from absolute path and filename
fullpath="$path/$name";
请注意,此脚本的副作用是将 $OLDPWD(cd - 使用)替换为脚本目录。如果您需要避免这种情况,只需在 cd - 之前保存 $OLDPWD 并在最后恢复它。
realpath。假设您安装了realpath 命令,您可以用以下代码替换此代码:
fullpath=`realpath "$_"`
【讨论】:
您可以使用BASH_SOURCE 变量,然后使用readlink 获取完整路径:
echo $BASH_SOURCE
# to get full path
fullpath=$(readlink --canonicalize --no-newline $BASH_SOURCE)
echo "$fullpath"
这将打印所获取文件的调用路径,因此在您的情况下:
~/dev/setup.sh
~/dev/setup.sh
BASH_SOURCE一个数组变量,其成员是源文件名,其中定义了
FUNCNAME数组变量中的相应shell 函数名称。 shell函数${FUNCNAME[$i]}在文件${BASH_SOURCE[$i]}中定义,从${BASH_SOURCE[$i+1]}调用
【讨论】:
readlink 的建议,以防此文件是通过相对路径获取的。
【讨论】:
realpath 一些选项,这取决于人们希望它如何处理符号链接。