W przypadku niektórych sesji powłoki chcę mieć możliwość drukowania flagi ostrzeżenia, jeśli zmienna powłoki nie jest ustawiona i wyeksportowana.
Jest dość proste, aby zrobić coś takiego, aby wydrukować „Błąd” w monicie, jeśli SET_ME
jest rozbrojony lub zerowy.
test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
Jednak to nie oznacza flagi, jeśli ustawię SET_ME
bez eksportowania, co jest błędem, który chcę wykryć. Czy brakuje czegoś takiego jak $(bash -c 'test -z "$SET_ME" && echo Error;')
grepowanie export
, czy jest prosty test, który mogę zrobić, aby sprawdzić, czy SET_ME
został wyeksportowany?
Rozwiązanie nieobsługujące POSIX, tylko bash, jest całkowicie dopuszczalne.
bash
environment-variables
CB Bailey
źródło
źródło
typeset
atrybutów.-z "$1"
zakładam, że przekazuję wartość zmiennej dotest_var
(tak jak byłem), podczas gdydeclare -p
oczekuje jej nazwy. Wpadłem na ten test, który przybiera nazwę zmiennej powłoki:test_exported_notnull () { re='^declare -\w*x'; [[ -n $(eval echo \$$1) ]] && [[ $(declare -p "$1") =~ $re ]]; }
.eval
, po prostu dodaj ten pierwszy wiersz:,var=$1
a następnie użyj[[ -z "${!var}" ]] && echo Error
.Wiem, że pytanie ma 3 lata, jednak poniższe rozwiązanie może być prostsze:
odpowiada, jeśli zmienna jest eksportowana i ma niepustą wartość.
źródło
W wersji Bash 4.4 lub nowszej możesz użyć
${parameter@a}
rozszerzenia parametrów powłoki, aby uzyskać listę atrybutów dotyczących parametru, w tym jeśli jest on eksportowany.Oto prosta funkcja pokazująca
${parameter@a}
, czy dana zmienna jest eksportowana, biorąc pod uwagę jej nazwę:Przykład zastosowania:
Jak to działa:
Format zwracany przez
${parameter@a}
to jeden znak na atrybut, przy czym znaczenie każdego znaku atrybutu pochodzi z odpowiednich opcji polecenia deklaracji - w tym przypadku chcemy szukaćx
- eksportowane.źródło
Możesz użyć
compgen
tej-X
opcji, aby określić, czy zmienna jest eksportowana:Na przykład:
źródło
Jeśli zrezygnuję z konieczności używania
export
igrep
, najprostszy test jest prawdopodobnie taki.lub jeśli chcę również wartość inną niż null:
źródło
export
jest nieokreślony i definiuje dokładny formatexport -p
podobny do bash,export
ale inny. Ale bash wydaje się ignorować POSIX i używać tego samego formatu coexport
dlaexport -p
!export
Polecenia podane bez parametrów, podaje listę eksportowanych nazwisk w obecnej sytuacji:Trochę cięcia i sedingu pozbywa się puchu:
Twoja lista eksportów jest gotowa do dalszego przetwarzania.
źródło
export
”), ponieważ moje planowane użycie jest w mojej linii.export
, i to była jedyna rzecz, jaką wymyśliłem. Nie ucieka też żadna pomoc ze strony powłoki. Wexport
każdym razie jest wbudowany, ale wątpię, czy można tego uniknąćgrep
.Najprostsza metoda, jaką obecnie mogę wymyślić:
źródło