shell获取脚本本身名称_从脚本本身获取Bash脚本的源目录

#!/bin/bashDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

是一个有用的单行程序,它将为您提供脚本的完整目录名称,无论它在何处被调用。

只要用于查找脚本的路径的最后一个组件不是符号链接(目录链接正常),它就会起作用。如果您还想解决脚本本身的任何链接,则需要一个多行解决方案:#!/bin/bashSOURCE="${BASH_SOURCE[0]}"while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink

DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"

SOURCE="$(readlink "$SOURCE")"

[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the

symlink file was locateddoneDIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"

这最后一个将与别名的任意组合工作,source,bash -c,符号链接等。

注意:如果您cd在运行此代码段之前访问其他目录,结果可能不正确!

另外,如果用户巧妙地重写了cd以将输出重定向到stderr(包括转义序列,例如在Mac上调用时),请注意$CDPATH陷阱和stderr输出副作用update_terminal_cwd >&2。>/dev/null 2>&1在cd命令结束时添加将兼顾两种可能性。

要了解它是如何工作的,请尝试运行这个更详细的表单:#!/bin/bashSOURCE="${BASH_SOURCE[0]}"while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink

TARGET="$(readlink "$SOURCE")"

if [[ $TARGET == /* ]]; then

echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"

SOURCE="$TARGET"

else

DIR="$( dirname "$SOURCE" )"

echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"

SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located

fidoneecho "SOURCE is '$SOURCE'"RDIR="$( dirname "$SOURCE" )"DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"if

[ "$DIR" != "$RDIR" ]; then

echo "DIR '$RDIR' resolves to '$DIR'"fiecho "DIR is '$DIR'"

它将打印如下:SOURCE './scriptdir.sh' is a relative symlink to 'sym2/scriptdir.sh' (relative to '.')

SOURCE is './sym2/scriptdir.sh'

DIR './sym2' resolves to '/home/ubuntu/dotfiles/fo fo/real/real1/real2'

DIR is '/home/ubuntu/dotfiles/fo fo/real/real1/real2'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值