私は開発環境の設定を担当するスクリプトをリバースエンジニアリングするのに役立つテストスクリプトを作成しています。
スクリプト:
#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
ここでは、2つの変数を印刷してソートし、一意の行だけを印刷し、新しい変数のみを印刷するように渡します。
$ sh ./env-changes ./dummy-env-script.sh
I_AM_NEW=hello