新しく導入された環境変数を表示するための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と互換性があるようにする方法について提案がありますか?

ベストアンサー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

おすすめ記事