linux中BASH_SOURCE[0]
在C/C++中,__FUNCTION__常量記錄當前函數(shù)的名稱。有時候,在日志輸出的時候包含這些信息是非常有用的。而在Bash中,同樣有這樣一個常量FUNCNAME,但是有一點區(qū)別是,它是一個數(shù)組而非字符串,其中數(shù)組的第一個元素為當前函數(shù)的名稱。可能初看有點難以理解,為什么FUNCNAME要是一個數(shù)組呢?看看下面的例子,你就明白了。
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_func17 echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
執(zhí)行后的結(jié)果為:
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 => ()
所以,更加準確地說,F(xiàn)UNCNAME是一個數(shù)組,但是bash中會將它維護成類似一個堆棧的形式。與FUNCNAME相似的另外一個比較有用的常量是BASH_SOURCE,同樣是一個數(shù)組,不過它的第一個元素是當前腳本的名稱。這在source的時候非常有用,因為在被source的腳本中,$0是父腳本的名稱,而不是被source的腳本名稱。而BASH_SOURCE就可以派上用場了。
1 # If the script is sourced by another script2 if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]3 then4 do_something5 else # Otherwise, run directly in the shell6 do_other7 fi
BASH_SOURCE[0] BASH_SOURCE[0] 等價于 BASH_SOURCE, 取得當前執(zhí)行的shell文件所在的路徑及文件名。
在目錄/home/sam/linux編程練習/Shell下新建腳本test.sh:
1 #!/bin/bash2 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 $DIR6 echo "ok"
執(zhí)行的時候,需要棵執(zhí)行權(quán)限:chmod +x test.sh 然后執(zhí)行./test.sh 而不是 sh ./test.sh
經(jīng)測試以上寫都正確:輸出
1 /home/sam/linux編程練習2 ok
其實就是一個:1.取得當前執(zhí)行的shell文件所在的完整路徑 2. 執(zhí)行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/}
${@// /\\ }
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。