Singkat cerita:set
dapat melihat variabel shell-local, env
tidak bisa.
Shell dapat memiliki 2 jenis variabel:lokal, yang hanya dapat diakses dari shell saat ini, dan variabel lingkungan (diekspor), yang diteruskan ke setiap program yang dijalankan.
Sejak set
adalah bawaan perintah shell, ia juga melihat variabel shell-local (termasuk fungsi shell). env
di sisi lain adalah executable independen; ia hanya melihat variabel yang diteruskan oleh shell, atau variabel lingkungan.
Saat Anda mengetik baris seperti a=1
kemudian variabel lokal dibuat (kecuali sudah ada di lingkungan). Variabel lingkungan dibuat dengan export a=1
Jika Anda ingin membatasi output dari set
perintah ke variabel saja, Anda dapat menjalankannya dalam mode POSIX:
type -a env set
help set
(set -o posix; set) | nl
Jika Anda memerlukan kontrol yang lebih baik atas daftar variabel tertentu, Anda dapat menggunakan bawaan Bash seperti declare
atau compgen
, atau beberapa trik Bash lainnya.
man bash | less -p '-A action$' # info on complete & compgen
# listing names of variables
compgen -A variable | nl # list names of all shell variables
echo ${!P*} # list names of all variables beginning with P
compgen -A export | nl # list names of exported shell variables
export | nl # same, plus always OLDPWD
declare -px | nl # same
declare -pr # list readonly variables
# listing names of functions
compgen -A function | nl
declare -F | nl
declare -Fx | nl
# show code of specified function
myfunc() { echo 'Hello, world!'; return 0; }
declare -f myfunc
set
adalah shell bawaan, sedangkan env
adalah sebuah program (/usr/bin/env)
set
melakukan beberapa hal, tetapi dengan sendirinya mencantumkan variabel lingkungan. Itu juga dapat menyetel/mengalihkan sakelar, seperti set +x
atau set -v
dll.
env
dengan sendirinya mencantumkan diekspor variabel lingkungan, tetapi dapat menjalankan program di lingkungan yang dimodifikasi
Lihat man 1 env
untuk informasi lebih lanjut.