Для некоторых сеансов оболочки я хочу иметь возможность печатать флаг предупреждения, если переменная оболочки не установлена и не экспортирована.
Это довольно просто сделать что-то вроде этого, чтобы напечатать «Ошибка» в приглашении, если SET_ME
не установлено или равно нулю.
test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
Однако это не помечается, если я установил SET_ME
без экспорта, что является ошибкой, которую я хочу быть в состоянии обнаружить. Если не $(bash -c 'test -z "$SET_ME" && echo Error;')
считать чего-то вроде или сгладить вывод export
, есть ли простая проверка, которую я могу сделать, чтобы проверить, SET_ME
был ли экспортирован?
Не POSIX, bash-only решение полностью приемлемо.
bash
environment-variables
CB Bailey
источник
источник
typeset
атрибуты.-z "$1"
предполагает, что я передаю значение переменнойtest_var
(как я был), в то время какdeclare -p
ожидает ее имя. Я пришел с этим тестом , который принимает имя переменной оболочки:test_exported_notnull () { re='^declare -\w*x'; [[ -n $(eval echo \$$1) ]] && [[ $(declare -p "$1") =~ $re ]]; }
.eval
, просто добавьте эту первую строку:,var=$1
затем используйте[[ -z "${!var}" ]] && echo Error
.Я знаю, что этому вопросу уже 3 года, но можно найти следующее решение проще:
ответы, если переменная экспортирована и имеет непустое значение.
источник
В Bash 4.4 или более поздней версии вы можете использовать
${parameter@a}
расширение параметра оболочки, чтобы получить список атрибутов о параметре, в том числе, если он экспортирован.Вот простая функция, демонстрирующая
${parameter@a}
, которая сообщит вам, экспортируется ли данная переменная, учитывая ее имя:Пример использования:
Как это устроено:
Формат, возвращаемый
${parameter@a}
одним символом на атрибут, со значением каждого символа атрибута, полученным из соответствующих опций команды объявлений - в этом случае мы хотим искатьx
- экспортированный.источник
Вы можете использовать
compgen
с его-X
опцией, чтобы определить, экспортируется ли переменная:Например:
источник
Если я смиряюсь с необходимостью использовать
export
иgrep
, возможно, самый простой тест будет примерно таким.или если я хочу также ненулевое значение:
источник
export
это не определено, и определяет точный формат дляexport -p
аналогичного bash,export
но различного. Но bash, похоже, игнорирует POSIX и использует тот же формат, что иexport
дляexport -p
!Команда
export
, заданная без параметров, дает список экспортированных имен в текущей среде:Некоторая стрижка и сединг избавляет от пуха:
Вот ваш список экспорта, готовый к дальнейшей переработке.
источник
export
»), поскольку мое запланированное использование находится в моем приглашении.export
, и это было единственное, что я придумал. Никакая помощь из оболочки не ускользает. Вexport
любом случае встроенный, но я сомневаюсь, что вы можете избежатьgrep
.Самый простой метод, который я сейчас могу представить:
источник