zoukankan      html  css  js  c++  java
  • 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 Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/sunfie/p/5943979.html
Copyright © 2011-2022 走看看