Bash
為什麼 export -p 排除 $_ 變數?
據我所知,有 3 種方法可以查看導出的變數:
$ export -p | wc -l 50 $ env | wc -l 51 $ printenv | wc -l 51
如您所見,
export -p
缺少單個變數。這是$_
一個:$ diff <(export -p |sed 's/declare -x //' | sed 's/"//g' | sort) <(printenv | sort) 41a42 > _=/usr/bin/printenv
$_
是特殊變數,設置為先前執行的命令的最終參數。為什麼export -p
不包括它,不像其他兩個命令?編輯
我知道導出
$_
可能沒有任何意義,但如果$_
沒有導出,為什麼它會出現在printenv
輸出中?printenv
列印環境變數,環境變數是導出的,$_
不是導出的。我在這裡錯過了什麼嗎?
$_
似乎不是 中的環境變數bash
,bash
只是將其導出到子程序的環境中。在 bash 本身內部,它似乎是一個普通的 shell 變數。但是請注意,執行第一個命令時情況並非如此:$ bash -c 'export -p | grep _=' declare -x _="/bin/bash"
然而,之後它顯示為一個正常變數:
$ bash -c ':; declare -p | grep _=' declare -- BASH_EXECUTION_STRING=":; declare -p | grep _=" declare -- _=":
不是這種情況
dash
:$ dash -c 'export -p | grep _=' export _='/bin/dash' $ dash -c ':; export -p | grep _=' export _='/bin/dash'
雖然在這裡它似乎只在互動模式下發揮其應有的作用:
$ dash $ : $ export -p | grep _= export _=':'