linux中BASH_SOURCE[0]
在C/C++中,__FUNCTION__常量記錄當(dāng)前函數(shù)的名稱。有時(shí)候,在日志輸出的時(shí)候包含這些信息是非常有用的。而在Bash中,同樣有這樣一個(gè)常量FUNCNAME,但是有一點(diǎn)區(qū)別是,它是一個(gè)數(shù)組而非字符串,其中數(shù)組的第一個(gè)元素為當(dāng)前函數(shù)的名稱。可能初看有點(diǎn)難以理解,為什么FUNCNAME要是一個(gè)數(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 => ()
所以,更加準(zhǔn)確地說(shuō),F(xiàn)UNCNAME是一個(gè)數(shù)組,但是bash中會(huì)將它維護(hù)成類似一個(gè)堆棧的形式。與FUNCNAME相似的另外一個(gè)比較有用的常量是BASH_SOURCE,同樣是一個(gè)數(shù)組,不過(guò)它的第一個(gè)元素是當(dāng)前腳本的名稱。這在source的時(shí)候非常有用,因?yàn)樵诒籹ource的腳本中,$0是父腳本的名稱,而不是被source的腳本名稱。而B(niǎo)ASH_SOURCE就可以派上用場(chǎng)了。
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] 等價(jià)于 BASH_SOURCE, 取得當(dāng)前執(zhí)行的shell文件所在的路徑及文件名。
在目錄/home/sam/linux編程練習(xí)/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í)行的時(shí)候,需要棵執(zhí)行權(quán)限:chmod +x test.sh 然后執(zhí)行./test.sh 而不是 sh ./test.sh
經(jīng)測(cè)試以上寫都正確:輸出
1 /home/sam/linux編程練習(xí)2 ok
其實(shí)就是一個(gè):1.取得當(dāng)前執(zhí)行的shell文件所在的完整路徑 2. 執(zhí)行dirname,并進(jìn)入父級(jí)目錄 3. 打印當(dāng)前工作目錄的過(guò)程
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
通過(guò)man bash,可以看到bash的特殊用法
1.${BASH_SOURCE-$0}
獲取腳本名稱
2. ${parameter:-default}
SLAVE_FILE=${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves} 指定默認(rèn)值
3. ${parameter/pattern/string/}
${@// /\\ }
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。