linux中BASH_SOURCE[0]
在C/C++中,__FUNCTION__常量记录当前函数的名称。有时候,在日志输出的时候包含这些信息是非常有用的。而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了。
1 #!/bin/bash 2 3 function test_func() 4 { 5 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" 6 another_func 7 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" 8 } 9 10 function another_func() 11 { 12 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" 13 } 14 15 echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})" 16 test_func 17 echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
执行后的结果为:
1 Out of function, $FUNCNAME => () 2 Current test_func, $FUNCNAME => (test_func main) 3 Current another_func, $FUNCNAME => (another_func test_func main) 4 Current test_func, $FUNCNAME => (test_func main) 5 Out of function, $FUNCNAME => ()
所以,更加准确地说,FUNCNAME是一个数组,但是bash中会将它维护成类似一个堆栈的形式。与FUNCNAME相似的另外一个比较有用的常量是BASH_SOURCE,同样是一个数组,不过它的第一个元素是当前脚本的名称。这在source的时候非常有用,因为在被source的脚本中,$0是父脚本的名称,而不是被source的脚本名称。而BASH_SOURCE就可以派上用场了。
1 # If the script is sourced by another script 2 if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ] 3 then 4 do_something 5 else # Otherwise, run directly in the shell 6 do_other 7 fi
BASH_SOURCE[0] BASH_SOURCE[0] 等价于 BASH_SOURCE, 取得当前执行的shell文件所在的路径及文件名。
在目录/home/sam/linux编程练习/Shell下新建脚本test.sh:
1 #!/bin/bash 2 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )" 3 # DIR=$( cd "$( dirname ${BASH_SOURCE[0]} )/../" && pwd ) 4 # DIR=`cd $( dirname ${BASH_SOURCE[0]} )/../ && pwd` 5 echo $DIR 6 echo "ok"
执行的时候,需要棵执行权限:chmod +x test.sh
然后执行./test.sh
而不是 sh ./test.sh
经测试以上写都正确:输出
1 /home/sam/linux编程练习 2 ok
其实就是一个:1.取得当前执行的shell文件所在的完整路径 2. 执行dirname,并进入父级目录 3. 打印当前工作目录的过程
1 # echo "${BASH_SOURCE[0]}" 2 # echo "${BASH_SOURCE}" 3 # echo "$( dirname "${BASH_SOURCE[0]}" )" 4 # DIR="$( cd "$( dirname ${BASH_SOURCE[0]} )" && pwd )" 5 # echo $DIR
通过man bash,可以看到bash的特殊用法
1.${BASH_SOURCE-$0}
获取脚本名称
2. ${parameter:-default}
SLAVE_FILE=${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves} 指定默认值
3. ${parameter/pattern/string/}
${@// /\\ }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决