zoukankan      html  css  js  c++  java
  • linux中BASH_SOURCE[0](转)

    转自:http://www.cnblogs.com/sunfie/p/5943979.html

    在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
  • 相关阅读:
    缓存雪崩与缓存穿透
    读取表中最大值
    使用vscode在谷歌上运行代码
    elment 中tree组件展开所有和收缩所有节点
    深度系统商店提示无法安装软件依赖错误
    诗词,理解,品论
    《45个十分钟读懂资本论》原文、适合朗读版和个人见解
    《论持久战》全文
    OSError: [WinError 126] 找不到指定的模块。
    C++ 获取序列最大(或最小)的 N 个元素
  • 原文地址:https://www.cnblogs.com/zdfjf/p/6674926.html
Copyright © 2011-2022 走看看