Bash
用於顯示新引入的環境變數的 Bash 腳本
我正在製作這個測試腳本來幫助我對負責設置開發環境的腳本進行逆向工程。
劇本:
#env-changes #!/bin/bash TESTED_SCRIPT=$1 shift ENV_BEFORE=$(env | sort) . $TESTED_SCRIPT ENV_AFTER=$(env | sort) diff <(printf '%s\n' "$ENV_BEFORE") <(printf '%s\n' "$ENV_AFTER")
虛擬環境腳本:
#!/bin/bash export I_AM_NEW=hello
用法:
$ ./env-changes dummy-env-script.sh 21a22 > I_AM_NEW=hello
目前它僅適用於
bash
. 關於如何使其更符合 POSIX 的建議?
首先,POSIX
source
命令只會從PATH
. 為了解決這個問題,您需要使用完整路徑:sh ./env-changes ./dummy-env-script.sh
此外,攜帶式版本
source
是.
:. "$1"
然後,該
<()
構造不是 POSIX,因此您需要解決這個問題。例如,您可以使用臨時文件:tmp1=$(mktemp) tmp2=$(mktemp) env | sort > "$tmp1" . "$1" env | sort > "$tmp2" diff "$tmp1" "$tmp2" rm "$tmp1" "$tmp2"
或者,另一種方法:
ENV_BEFORE=$(env) . "$1" ENV_AFTER=$(env) printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u
在這裡,我們列印兩個變數,對它們進行排序,傳遞它們,
uniq -u
這將只列印唯一的行,只列印新變數:$ sh ./env-changes ./dummy-env-script.sh I_AM_NEW=hello