原网址链接:https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within
一个非常好用又简单的方法,不管是软连接还是硬链接都可以获取
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ];
do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
${BASH_SOURCE[0]}可以获取文件目录,接着判断其是否为软连接,如果是的话,获取其绝对路径。
如果不是软连接目录,可以直接用以下方式来获取获取脚本的完整目录名称。
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
另外一个比较好用的变量FUNCNAME,是用于获取函数名称,注意,他是一个数组而非字符串,其中数组的第一个元素为当前函数的名称
#!/bin/bash
function test_func(){
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
another_func
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"}
function another_func(){
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"}
echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
test_func
echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
输出结果:
Out of function, $FUNCNAME => ()
Current test_func, $FUNCNAME => (test_func main)
Current another_func, $FUNCNAME => (another_func test_func main)
Current test_func, $FUNCNAME => (test_func main)
Out of function, $FUNCNAME => ()