In un modo compatibile con posix che funziona con più implementazioni, come posso stampare l'elenco delle variabili d'ambiente attualmente definite senza i loro valori?
Su alcune implementazioni (mksh, freebsd / bin / sh), solo l'utilizzo export
da solo si adatta al conto:
$ export
FOO2
FOO
Ma per alcune altre implementazioni (bash, zsh, dash), export
mostra anche il valore. Con bash, ad esempio:
$ 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$
Altre opzioni come env
o printenv
non hanno opzioni per stampare solo i nomi delle variabili senza valori, almeno non sulle piattaforme linux e freebsd che ho provato.
Piping su awk / sed / etc. o tagliare la lista con tecniche di espansione dei parametri (ad es. ${foo%%=*}
) è accettabile, ma deve lavorare con valori che possono estendersi su linee e avere =
e spazi bianchi nel valore (vedi esempio sopra).
Le risposte specifiche a particolari implementazioni della shell sono interessanti, ma sto principalmente cercando qualcosa che sia compatibile tra le implementazioni.
export -p
per questo?
export -p
perché questo ti darebbe un output coerente su tutte le shell POSIX, che hai detto che volevi.
export -p
non soddisfa il primo requisito: stampare solo nomi di variabili senza valori.
export -p
. Non scriverò questo parsing, perché nel caso generale, dovrebbe anche fare un corretto parsing delle quotazioni, nel caso in cui tu abbia una variabile il cui valore è qualcosa del genere hello\nexport var=value
. Uno dei pochi altri comandi che ti darà un output coerente in tutte le shell POSIX è env
, ma quell'output è più difficile da analizzare poiché manca il export =
bit.
export -p
specificato da POSIX per generare output adatto anche all'input nella shell.