• 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/}

    ${@// /\ }

  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/sunfie/p/5943979.html
Copyright © 2020-2023  润新知