Bash

用於顯示新引入的環境變數的 Bash 腳本

  • March 14, 2016

我正在製作這個測試腳本來幫助我對負責設置開發環境的腳本進行逆向工程。

劇本:

#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 的建議?

首先,POSIXsource命令只會從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

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