博客專欄

        EEPW首頁 > 博客 > linux中BASH_SOURCE[0]

        linux中BASH_SOURCE[0]

        發布人:電子禪石 時間:2023-01-11 來源:工程師 發布文章

        在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_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 => ()

            所以,更加準確地說,FUNCNAME是一個數組,但是bash中會將它維護成類似一個堆棧的形式。與FUNCNAME相似的另外一個比較有用的常量是BASH_SOURCE,同樣是一個數組,不過它的第一個元素是當前腳本的名稱。這在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, 取得當前執行的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"
        復制代碼

        執行的時候,需要棵執行權限: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/}

        ${@// /\\ }


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: shell

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阿图什市| 张家界市| 夏津县| 成武县| 阜康市| 腾冲县| 肥东县| 太保市| 英德市| 疏附县| 鄂托克旗| 晋城| 昌邑市| 沙湾县| 盘山县| 随州市| 郁南县| 九寨沟县| 峨山| 两当县| 贡嘎县| 山丹县| 定西市| 元阳县| 万宁市| 莆田市| 平泉县| 安塞县| 洞口县| 芜湖市| 伊宁县| 万州区| 桃源县| 河西区| 都江堰市| 政和县| 于田县| 饶河县| 双流县| 澳门| 昭苏县|