Em primeiro lugar, o comando POSIX source
só irá fornecer arquivos de diretórios no PATH
. Para contornar isso, você precisará usar um caminho completo:
sh ./env-changes ./dummy-env-script.sh
Além disso, a versão portátil de source
é .
:
. "$1"
Em seguida, a construção <()
não é POSIX, portanto, você precisará contornar isso. Por exemplo, você pode usar arquivos temporários:
tmp1=$(mktemp)
tmp2=$(mktemp)
env | sort > "$tmp1"
. "$1"
env | sort > "$tmp2"
diff "$tmp1" "$tmp2"
rm "$tmp1" "$tmp2"
Ou uma abordagem diferente:
ENV_BEFORE=$(env)
. "$1"
ENV_AFTER=$(env)
printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u
Aqui, imprimimos as duas variáveis, classificamos, passamos uniq -u
, que imprime linhas únicas, imprimindo apenas a nova variável:
$ sh ./env-changes ./dummy-env-script.sh
I_AM_NEW=hello