Bash

為什麼 export -p 排除 $_ 變數?

  • May 1, 2020

據我所知,有 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列印環境變數,環境變數是導出的,$_不是導出的。我在這裡錯過了什麼嗎?

$_似乎不是 中的環境變數bashbash只是將其導出到子程序的環境中。在 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 _=':'

引用自:https://unix.stackexchange.com/questions/118286