Berikut ini beberapa solusinya:
$ comm -3 <(declare | sort) <(declare -f | sort)
kerusakan:
declare
mencetak setiap variabel yang ditentukan (diekspor atau tidak) dan berfungsi.
declare -f
hanya mencetak fungsi.
comm -3
akan menghapus semua baris yang umum untuk keduanya. Akibatnya ini akan menghapus fungsi, hanya menyisakan variabel.
Untuk hanya mencetak variabel yang tidak diekspor:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Solusi lain:
$ declare -p
Ini hanya akan mencetak variabel, tetapi dengan beberapa atribut jelek.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Anda dapat memotong atribut menggunakan ... potong:
$ declare -p | cut -d " " -f 3
Satu kelemahannya adalah bahwa nilai IFS ditafsirkan alih-alih ditampilkan.
membandingkan:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Ini membuatnya sangat sulit untuk menggunakan output itu untuk diproses lebih lanjut, karena itu satu-satunya "
dalam satu baris. Mungkin beberapa IFS-fu dapat dilakukan untuk mencegah hal ini.
Solusi lain, menggunakan compgen
:
$ compgen -v
Bash builtin compgen
dimaksudkan untuk digunakan dalam skrip penyelesaian. Untuk tujuan ini, compgen -v
daftarkan semua variabel yang ditentukan. The downside: itu hanya mencantumkan nama variabel, bukan nilai.
Berikut ini adalah retasan untuk juga mencantumkan nilai.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Keuntungan: itu adalah solusi bash murni. Kerugiannya: beberapa nilai kacau karena interpretasi yang mendalam printf
. Subkulit dari pipa dan / atau loop menambahkan beberapa variabel tambahan.