用于显示新引入的环境变量的 Bash 脚本

The*_*eer 4 shell bash posix portability

我正在制作这个测试脚本来帮助我反向工程负责设置开发环境的脚本。

剧本:

#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")
Run Code Online (Sandbox Code Playgroud)

虚拟环境脚本:

#!/bin/bash
export I_AM_NEW=hello
Run Code Online (Sandbox Code Playgroud)

用法:

$ ./env-changes dummy-env-script.sh 
21a22
> I_AM_NEW=hello
Run Code Online (Sandbox Code Playgroud)

目前它仅适用于bash. 关于如何使其更符合 POSIX 的建议?

ter*_*don 5

首先,POSIXsource命令只会从PATH. 为了解决这个问题,您需要使用完整路径:

sh ./env-changes ./dummy-env-script.sh
Run Code Online (Sandbox Code Playgroud)

此外,便携式版本source.

. "$1"
Run Code Online (Sandbox Code Playgroud)

然后,该<()构造不是 POSIX,因此您需要解决这个问题。例如,您可以使用临时文件:

tmp1=$(mktemp)
tmp2=$(mktemp)
env | sort > "$tmp1"
. "$1"
env | sort > "$tmp2"
diff "$tmp1" "$tmp2"
rm  "$tmp1" "$tmp2"
Run Code Online (Sandbox Code Playgroud)

或者,另一种方法:

ENV_BEFORE=$(env)
. "$1"
ENV_AFTER=$(env)
printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u
Run Code Online (Sandbox Code Playgroud)

在这里,我们打印两个变量,对它们进行排序,通过它们uniq -u只会打印唯一的行,仅打印新变量:

$ sh ./env-changes ./dummy-env-script.sh 
I_AM_NEW=hello
Run Code Online (Sandbox Code Playgroud)