Cara yang paling portabel adalah export -p
.
export -p
daftar variabel yang diekspor. Ini biasanya seperti declare -x
, jika shell Anda memiliki declare
.
Kerang Bourne-style yang sedang digunakan harus mendukung export -p
, seperti yang disyaratkan oleh POSIX :
Ketika -p ditentukan, ekspor harus menulis ke output standar nama dan nilai dari semua variabel yang diekspor, dalam format berikut:
"export %s=%s\n", <name>, <value>
jika nama diatur, dan:
"export %s\n", <name>
jika nama tidak disetel.
Standar selanjutnya menjelaskan bahwa nilai variabel ditampilkan sedemikian rupa yang biasanya memungkinkannya untuk digunakan nanti di sisi kanan =
dalam penugasan. Ini untuk mengatakan bahwa itu dapat dikutip. Kerang yang berbeda dapat menampilkannya secara berbeda tetapi dengan efek yang sama. export -p
bekerja bahkan di shell yang tidak memiliki declare
builtin, seperti Dash .
$ dash -c 'export -p | grep HOME=' # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME=' # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek
Saya telah memipipkan output ke grep
untuk kekompakan tetapi jika Anda tidak memfilternya maka Anda mendapatkan daftar lengkap dari variabel yang diekspor. Dari pertanyaan Anda, sepertinya itulah yang menurut Anda paling berguna.
Beberapa shell, seperti Bash, menggunakan format non-standar kecuali diperintahkan secara eksplisit untuk berperilaku sesuai cara POSIX. Di Bash export -p
memberikan output yang sama declare -x
dengan default.
$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME=' # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"
Zsh menunjukkan format yang tidak standar bahkan ketika kompatibilitas POSIX diaktifkan:
$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
Dalam kasus apa pun, Anda dapat mengekstraksi representasi portabel (yang dapat dikutip) dengan mencari kata yang diikuti oleh =
. Ini tidak bergantung pada kata-kata sebelumnya di telepon, asalkan mereka tidak segera mendahului =
, yang seharusnya tidak mereka lakukan. Sebagai contoh:
% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....
Perhatikan bahwa tidak semua entri memiliki =
. Ini karena variabel dapat tidak disetel tetapi diekspor. Entri-entri itu disaring oleh grep
perintah di atas, yang mungkin atau mungkin tidak seperti yang Anda inginkan.
Sebagian besar waktu, Anda hanya ingin memeriksa output dan sehingga Anda tidak akan peduli jika entri didahului oleh export
, declare -x
, typeset -x
, atau sesuatu yang lain. Maka jalankan saja export -p
.
Saya menguji perintah-perintah itu di Ubuntu 16.04 LTS dengan versi resmi setiap paket shell.