我正在制作这个测试脚本来帮助我对负责设置开发环境的脚本进行逆向工程。
剧本:
#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 标准的建议?
答案1
首先,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