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