Прежде всего, команда POSIX source
команда будет исходными файлами только из каталогов в PATH
. Чтобы обойти это, вам нужно будет использовать полный путь:
sh ./env-changes ./dummy-env-script.sh
Кроме того, переносимая версия источника
- это .
:
. "$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
Вы можете сделать это с помощью перенаправления
for progs in ${list[@]}; do
a="${progs}_MIN_REQ"
b="${progs}_CURR"
echo "$progs: ${!a}:${!b}"
done
for progs in "${list[@]}"; do
eval 'echo "$progs: ${'"${progs}"'_MIN_REQ}:${'"${progs}"'_CURR}"'
done