W jaki sposób mogę wydrukować listę aktualnie zdefiniowanych zmiennych środowiskowych bez ich wartości w sposób zgodny z posix, który działa z wieloma implementacjami ?
W niektórych implementacjach (mksh, freebsd / bin / sh), samo użycie export
będzie pasować do rachunku:
$ export
FOO2
FOO
Ale w przypadku niektórych innych implementacji (bash, zsh, dash) export
również pokazuje wartość. Z bash na przykład:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
Inne opcje, takie jak env
lub printenv
nie mają możliwości, aby wydrukować tylko nazwy zmiennych bez wartości, a przynajmniej nie na platformach Linux i FreeBSD próbowałem.
Przesyłanie strumieniowe do awk / sed / etc. lub przycinanie listy za pomocą technik rozszerzania parametrów (np. ${foo%%=*}
) jest dopuszczalne, ale musi współpracować z wartościami, które mogą obejmować linie i zawierać =
oraz spacje w wartości (patrz przykład powyżej).
Odpowiedzi dotyczące konkretnych implementacji powłoki są interesujące, ale przede wszystkim szukam czegoś, co będzie kompatybilne z różnymi implementacjami.
export -p
?
export -p
ponieważ dałoby to spójny wynik we wszystkich powłokach POSIX, co powiedziałeś, że chcesz.
export -p
nie spełnia pierwszego wymagania - wypisuje tylko nazwy zmiennych bez wartości.
export -p
. Nie zamierzam pisać tego parsowania, ponieważ w ogólnym przypadku musiałoby to również wykonać prawidłowe parsowanie cytatów, na wypadek gdybyś miał zmienną, której wartość jest podobna hello\nexport var=value
. Jednym z niewielu innych poleceń, które zapewniają spójny wynik we wszystkich powłokach POSIX, jest env
jednak trudniejsze do przeanalizowania, ponieważ brakuje w nim export =
bitu.
export -p
określonym przez POSIX, aby wygenerować wyjście, które jest również odpowiednie dla danych wejściowych w powłoce.