Возврат ненулевого статуса выхода (failure) при неудачной печати содержимого переменной окружения кажется мне правильным. Это соответствует поведению одноименной встроенной программы tcsh
и историческим реализациям на BSD.
Если этого не сделать, то будет трудно отличить переменную, которая установлена в пустое значение, от переменной, которая не установлена.
Если вы хотите избежать эффекта set -e
/set -o errexit
, используйте:
var=$(printenv VAR) || : Do not care if it fails
Или:
if var=$(printenv VAR); then
if [ -z "$var" ]; then
echo "VAR is set but empty or consists only of newline characters"
else
echo "VAR is set and non-empty"
fi
else
echo "VAR is not in the environment"
fi
Также обратите внимание, что все оболочки инициализируют переменные оболочки из соответствующих переменных окружения (для тех, которые могут быть отображены в переменные оболочки, а некоторые оболочки обрезают другие), поэтому вы можете использовать $VAR
в вашем скрипте для ссылки на их значение (обратите внимание, однако, что в оболочках Bourne, csh или tcsh (единственные оболочки, в которых вы можете захотеть использовать эти `. ...`
ваших), значения переменных shell и env var могут расходиться, если вы измените переменную shell без ее экспорта (или присвоите ее с помощью setenv
для (t)csh)).