Apa yang dilakukan set
perintah tanpa argumen?
Seperti yang saya lihat itu mencetak variabel lingkungan saya seperti env
perintah tetapi dalam urutan abjad. Dan selanjutnya mencetak beberapa informasi yang berbeda (variabel? Fungsi?) Seperti:
__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
Apa itu dan dari mana asalnya?
Saya tidak dapat menemukan informasi tentang set
perintah tanpa argumen. Sebenarnya saya tidak memiliki man
halaman untuk set
distribusi Linux saya sama sekali.
Jawaban:
set
adalah built-in shell yang menampilkan semua variabel shell, tidak hanya yang lingkungan, dan juga fungsi shell, yang adalah apa yang Anda lihat di akhir daftar.Variabel ditampilkan dengan sintaks yang memungkinkan mereka untuk diatur ketika garis dieksekusi atau bersumber.
Dari
bash
halaman manual :Pada cangkang yang berbeda, perilakunya tidak harus sama; misalnya,
ksh
set
tidak menampilkan fungsi shell.sumber
ksh
tidak menyimpan definisi fungsi dalam variabel shell.Karena
set
memiliki output danwhich set
mengembalikan apa pun yang Anda tahu itu bagian dari shell yang Anda gunakan, mungkin bash.man bash menyebutkannya berkali-kali tetapi lebih mudah untuk ditautkan dalam dokumentasi online .
set memiliki spesifikasi panggilan:
jadi jika Anda ingin menemukannya secara manual di baris perintah Anda dapat mencari
sumber
which set
tergantung pada cangkang Anda. Setidaknyazsh
akan melaporkannya untuk Anda. Anda juga dapat membaca ini untuk lebih jelasnya.set
adalah shell builtin , digunakan untuk opsi shell dan set unset dan parameter posisi.Tanpa argumen,
set
akan mencetak semua variabel shell (variabel lingkungan dan variabel dalam sesi saat ini) diurutkan dalam lokal saat ini .Anda juga dapat membaca dokumentasi bash .
Ada beberapa peringatan.
set "$var"
akan memberikanvar
nilai$1
. Jika$var
mulai dengan-
atau+
, maka$var
konten diperlakukan sebagai urutan opsi shell. Jika$var
berisi opsi yang tidak valid, sebagian besar shell POSIX akan mencetak kesalahan.yash
danzsh
dish
,ksh
emulasi tidak hanya mencetak kesalahan, tetapi juga pilihan pengaturan valid. Sementarayash
berhenti mengatur opsi pada opsi tidak valid pertama,zsh
akan menetapkan semuanya. Dalamyash
:f
danx
akan hadir$-
, sementara:hanya
f
hadir di$-
. Dalam kedua kasus,f
danx
akan hadir di$-
denganzsh
dish
danksh
emulasi.Untuk melindungi Anda dari situasi itu, Anda dapat memberikan
--
argumen pertama untuk menetapkan parameter posisi meskipun diawali dengan-
atau+
:akan ditugaskan
$var
untuk$1
, terlepas dari kontennya.set --
tanpa argumen lebih lanjut akan membatalkan semua parameter posisi.Jika argumen pertama adalah
-
, perilaku tersebut tidak ditentukan. Semua shell POSIX yang dikenal akan di-unsetx
danv
opsi (kecualiposh
), dan menetapkan apa pun setelah-
parameter posisi:akan ditugaskan
-f
untuk$1
.set -
juga tidak menghapus parameter posisi. Schily osh juga berperilaku seperti itu. Pusaka sh jangan disetelv
danx
opsi.Satu-satunya pengecualian shell POSIX adalah
yash
, yang memperlakukan-
sebagai parameter posisi pertama:Schily bahkan tidak melakukan apa pun jika
-
ada dalam argumen:sumber
set -- $unset
,set - $unset
,set $unset
, danset "$unset"
dan sebagainya - biasanya mereka perbedaan yang membuat orang menjadi semacam masalah di tempat pertama.$unset
.set $unset
akan bertindak sama persis sepertiset
untuk variabel yang tidak disetel. Tetapiset "$unset"
akan mencatat, jikaunset
sebenarnya adalah variabel yang tidak disetel. Aset - $unset
menghapus opsi-v
dan-x
mengatur (dalam bash).unset_var
. Dan perhatikan juga bahwaset "$unset"
sebenarnya diatur$1
ke kosong. Itu tentang ekspansi shell, tidak sepenuhnya untukset
, jadi saya tidak menyebutkannya.posh
danyash
berbeda ketika-
muncul. Anda dapat membaca pembaruan saya (dan merasa bebas untuk memperbaikinya).Jika Anda bekerja di dalam bash shell, ketik
help set
.Di akhir bantuan dicetak, baca:
Jadi, argumen no
set
mencetak semua variabel yang dikenal ke shell.sumber
set -x; set
akan membantu