这是一个有用的单行程序,无论从哪里调用脚本,它都会为您提供脚本的完整目录名称。9 A# `5 i N0 }: g! g
只要用于查找脚本路径的最后一个组件不是符号链接(目录链接正常),它就会工作。如果您想分析脚本本身的任何链接,您需要更多的解决方案: # }* D% \; g; f4 S) y
#!/usr/bin/env 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 )% P! Z- T/ H) U) Y, n. q8 H6 L
#!/usr/bin/env 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'" 0 N4 a' ?9 b" _, j
它将打印以下内容: 4 R, C/ R" b! N L2 Y1 H
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' 5 u# m+ Y3 T! m* W2 ]4 Z