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

${@// /\\ }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM