Dengan cara yang kompatibel dengan posix yang bekerja dengan banyak implementasi, bagaimana saya bisa mencetak daftar variabel lingkungan yang didefinisikan saat ini tanpa nilainya?
Pada beberapa implementasi (mksh, freebsd / bin / sh), hanya menggunakan export
dengan sendirinya akan sesuai dengan tagihan:
$ export
FOO2
FOO
Tetapi untuk beberapa implementasi lainnya (bash, zsh, dash), export
juga menunjukkan nilainya. Dengan bash, misalnya:
$ 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$
Opsi lain suka env
atau printenv
tidak memiliki opsi untuk mencetak hanya nama variabel tanpa nilai, setidaknya tidak pada platform linux dan freebsd yang saya coba.
Perpipaan ke awk / sed / etc. atau memotong daftar dengan teknik ekspansi parameter (misalnya, ${foo%%=*}
) dapat diterima, tetapi harus bekerja dengan nilai-nilai yang dapat menjangkau garis dan memiliki =
dan spasi kosong dalam nilai (lihat contoh di atas).
Jawaban spesifik untuk implementasi shell tertentu menarik, tetapi saya terutama mencari sesuatu yang kompatibel di seluruh implementasi.
export -p
ini?
export -p
karena itu akan memberi Anda output yang konsisten di semua shell POSIX, yang Anda katakan Anda inginkan.
export -p
tidak sesuai dengan persyaratan pertama - hanya mencetak nama variabel tanpa nilai.
export -p
. Saya tidak akan menulis parsing itu, karena dalam kasus umum, itu juga harus melakukan parsing kutipan yang tepat, jika Anda memiliki variabel yang nilainya seperti hello\nexport var=value
. Salah satu dari beberapa perintah lain yang akan memberi Anda output yang konsisten di semua shell POSIX adalah env
, tetapi output itu lebih sulit untuk diurai karena tidak memiliki export =
bit.
export -p
yang ditentukan oleh POSIX untuk menghasilkan output yang juga cocok untuk input di shell.