set
dan shopt
keduanya builtin shell yang mengontrol berbagai opsi. Saya sering lupa opsi mana yang diatur oleh perintah mana, dan opsi mana yang ditetapkan / tidak disetel ( set -o/+o
, shopt -s/-u
). Mengapa ada dua perintah berbeda yang tampaknya melakukan hal yang sama (dan memiliki argumen berbeda untuk melakukannya)? Apakah ada cara mudah / mnemonic untuk mengingat opsi mana yang pergi dengan perintah yang mana?
72
help set
danhelp shopt
untuk memverifikasi bahwa bahkan penulis mereka berpikir mereka melakukan hal yang sama.Jawaban:
Sejauh yang saya tahu,
set -o
opsinya adalah yang diwarisi dari cangkang Bourne-style lainnya (kebanyakan ksh), danshopt
opsinya adalah yang khusus untuk bash. Tidak ada logika yang saya tahu.sumber
shopt
warisan?set -o
opsi sepertiposix
/physical
/interactive-comments
yang tidak adaksh
, danshopt
yang ada di shell lain termasukksh
untuk beberapa likelogin_shell
/nullglob
. Seperti yang Anda katakan, tidak ada logika. Mungkin itu adalah ide di awal (bahwa SHELLOPTS akan menjadi yang standar, dan BASHOPTS yang spesifik untuk bash), tapi itu hilang di sepanjang jalan, dan sekarang itu berakhir dengan menjengkelkan dan kegagalan desain UI.Perbedaannya adalah dalam variabel lingkungan yang diubah yang digunakan oleh bash. Pengaturan dengan
set
perintah menghasilkan$SHELLOPTS
. Pengaturan denganshopt
perintah menghasilkan$BASHOPTS
.sumber
shopt
dengan $ SH ELL OPT S daripada $ BA SHOPT S.set
adalah POSIX 7: opsi set - set atau unset dan parameter posisi | pubs.opengroup.orgshopt
bukan: Shell & Utilities: Detail Toc | pubs.opengroup.orgMungkin terkait dengan riwayat yang disebutkan oleh @Gilles.
sumber
Mudah tapi hilang dalam sejarah. The
set
perintah awalnya digunakan untuk memodifikasi lingkungan baris perintah dari kerang unix asli/bin/sh
. Kemudian ketika berbagai versi Unix berkembang, dan citarasa cangkang baru ditambahkan, orang-orang menyadari bahwa mereka perlu dapat mengubah lebih banyak (lingkungan) hal-hal untuk menjaga agar skrip shell kompatibel. Pada saat itu Bash menjadi sangat populer dan tambahan sh ell opt ion diperlukan, memperkenalkanshopt
.Anda benar-benar dapat melihat ini compat upaya ibility di
shopt
perintah.Tetapi tidak dalam
set
perintah.sumber
set
sebagai cara untuk mengatur opsi tidak di shell Unix asli, itu diperkenalkan oleh shell Bourne di akhir 70-an.set -o name
itu sendiri ditambahkan kemudian oleh shell Korn, ditentukan tetapi opsional dalam POSIX, masih belum didukung oleh versi "modern" dari shell Bourne seperti/bin/sh
Solaris 10.Dari buku "Linux Shell Scripting with Bash", hal 63:
sumber
Sepertinya opsi "set" diwarisi oleh subkulit dan shopt tidak.
sumber
set
tidak diwariskan oleh subkulit. Keduanyaset
danshopt
opsi tidak diwarisi oleh subkulit.set
danshopt
?set -o
danshopt
opsi diwarisi oleh subkulit ((...)
,,$(...)
komponen pipa). Apakah mereka diwarisi olehbash
doa lain tergantung pada apakahSHELLOPTS
atauBASHOPTS
tidak di lingkungan atau tidak.set
berasal dari shell bourne (sh) dan merupakan bagian dari standar POSIX,shopt
namun tidak dan spesifik bourne-shell (bash):sumber