Bagaimana saya bisa mendaftar opsi bash'es untuk shell saat ini?

27

Bash intepreter itu sendiri memiliki opsi, yaitu

Baris 22-23 dari halaman manual bash:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

Saya telah menggunakan beberapa pola pencarian di halaman bash man seperti:

  • /^\s*set
  • /list

Apakah mungkin untuk mencetak daftar pengaturan ini yang diterapkan pada shell saat ini?

the_velour_fog
sumber

Jawaban:

26
printf %s\\n "$-"

Akan mencantumkan opsi huruf tunggal dalam satu string.

Parameter itu juga dapat digunakan seperti:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

Pertama-tama nonaktifkan -fekspansi nama file shell sambil menyimpan nilai untuk $-- jika ada - dalam $1. Selanjutnya, tidak ada gumpalan terjadi, dan +fekspansi nama file terakhir sekali lagi diaktifkan, dan mungkin juga dinonaktifkan.

Misalnya, jika -fekspansi nama file sudah dinonaktifkan ketika nilai untuk $-pertama kali disimpan, maka nilai yang disimpannya akan (setidaknya) :

f

Dan ketika setdijalankan lagi, itu berfungsi untuk:

set +f -f

Yang hanya menempatkan Anda segera kembali ke tempat Anda mulai.

set +o

Akan mencantumkan semua setopsi shell tabel (lihat jawaban Jason untuk yang shoptmampu - apakah itu kata? - opsi) dalam bentuk yang aman untuk masuk kembali shell. Dengan cara itu, Anda juga bisa melakukan:

state=$(set +o)
set -some -crazy -options
eval "$state"

Untuk menyimpan, mengubah, dan mengembalikan status opsi shell masing-masing.

Untuk menangani opsi shoption dan settabel dalam sekali jalan:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

Anda juga dapat menelepon set tanpa argumen apa pun untuk menambahkan daftar semua variabel shell yang saat ini ditetapkan - juga dikutip untuk masuk kembali ke shell. Dan Anda dapat - dalam bash - menambahkan perintah typeset -fpuntuk juga menyertakan semua fungsi shell yang saat ini dideklarasikan. Anda dapat menyatukan semuanya dan evalsaat siap. Anda bahkan dapat menelepon aliastanpa argumen untuk alasan yang sama. Itu ... mungkin menutupinya. Saya kira ada "$@"- yang harus Anda letakkan dalam basharray terlebih dahulu, saya kira, sebelum melakukannyaset .

Tidak, ada juga trap. Yang ini sedikit lucu. Biasanya:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... hanya akan mencetak ini adalah subshell saya karena subshell adalah proses baru dan mendapatkan set sendiri traps - dan jadi tidak mewarisi traps tetapi yang orangtuanya secara eksplisit diabaikan - (seperti trap '' INT) .

Namun:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapberperilaku khusus ketika itu adalah perintah pertama dan satu - satunya yang dijalankan dalam subtitle perintah substitusi di mana ia akan mereproduksi daftar shell induk yang saat ini diatur trapsdalam format yang dikutip untuk masuk kembali secara aman ke shell. Dan Anda dapat melakukan itu save_traps, kemudian set tanpa argumen - dan semua yang telah disebutkan - untuk mendapatkan kunci pada semua kondisi shell. Anda mungkin ingin menambahkan export -pdan readonly -pmengembalikan atribut shell var yang asli secara eksplisit .

Bagaimanapun, itu sudah cukup.

mikeserv
sumber
terima kasih, kode Anda berfungsi dengan baik. jadi untuk mendapatkan daftar lengkap semua opsi, Anda harus menggunakan keduanya set +o dan shopt ? (Untuk shoptbisa menjadi kata, settabledigunakan di halaman manual, jadi shoptablebekerja untuk saya)
the_velour_fog
@ user4668401 - Saya pikir itu akan melakukannya.
mikeserv
TL; DR, tetapi +1000 untuk solusi 3 baris untuk mengubah opsi dan mengembalikannya 'sebagaimana adanya'. Itulah yang dibutuhkan seseorang saat membuat skrip atau instruksi copy / pastable.
Balmipour
@mikeserv Tampaknya opsi -p perlu ditambahkan saat menyimpan status untuk memasukkan shoption, yaitustate=$(set +o;shopt -p)
nkatsar
9

Dari manhalaman:

shopt
... Tanpa opsi, atau dengan opsi -p, daftar semua opsi yang dapat diatur ditampilkan, dengan indikasi apakah masing-masing diatur atau tidak.
shopt | grep on

akan mencetak daftar semua opsi yang diaktifkan.

jasonwryan
sumber
itu berhasil, terima kasih. Apakah Anda tahu jika ini mencantumkan opsi yang dapat diatur oleh keduanya setdan shopt?
the_velour_fog
@ user4668401 Tidak, setjauh lebih luas: lihat entri halaman manual .
jasonwryan
Dan untuk memeriksa apakah satu opsi aktif:shopt <option>
kos
ini akan menyertakan opsi dengan 'on' dalam nama (yaitu huponexit). cara mudah untuk memperbaikinya adalahshopt | grep on$
Mike D
6

Untuk membuat daftar semua opsi:

set -o

Untuk memeriksa opsi tertentu:

set -o | grep <OPTION>

Ambil opsi verbosesebagai contoh:

$ set -o | grep verbose
verbose         off
Jeremy Kao
sumber
6

Opsi ?: Ada tiga grup opsi dalam bash.

  1. Opsi membaca atau diatur oleh perintah set.
    (gunakan perintah ini untuk manual LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash:)
    Semua opsi satu huruf:abefhkmnptuvxBCEHPT

    Juga opsi (yang tidak memiliki setara satu huruf):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Opsi membaca atau diatur oleh perintah shopt.
    (Baca manual dengan perintah ini: LESS=+/'shopt \[-pqsu\]' man bash')
    Daftar ini cukup panjang tapi mudah untuk mencetak, gunakan:

    $ shopt -p

    atau yang serupa (tetapi tidak sama):

    $ shopt
  3. Opsi yang bisa diatur pada doa:
    (perintah untuk manual: LESS=+/'^INVOCATION' man bash)

    Semua setopsi:

    bash -abefhkmnptuvxBCEHPT

    Semua shoptopsi

    bash -O option

    Beberapa opsi yang hanya bermakna saat BERTANYA bash:

    bash -lirsDc

    Dan, juga (opsi panjang):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

Semua setopsi satu huruf dan -ridicetak dengan $-.

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

Sebagai contoh:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

Memanggil bash sebagai shell login hanya dilaporkan dengan shopt:

-l      Login
read with `shopt -p login_shell`

Demikian:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

Opsi -nini tidak dapat diuji dengan kode apa pun, karena artinya: jangan jalankan kode apa pun.


Opsi pencetakan

Alat terbaik untuk mendaftar opsi-opsi shell yang sedang berjalan , baik yang diset dengan setatau set dengan shoptadalah sama shopt. Untuk daftar opsi set:

shopt -o

Yang bertindak persis seperti set -o. Gunakan shopt -pountuk mendapatkan hasil yang sama dengan set +o.

Untuk daftar opsi shopt:

shopt -p

Dari mana Anda dapat memilih untuk mencetak yang ditetapkan shopt -psatau tidak disetelshopt -pu

Untuk mendapatkan semua opsi. Sebisa mungkin karena banyak opsi panjang dan beberapa ( -sDc) pada INVOCATION tidak dapat dicetak:

$ echo $-; shopt -p ; shopt -po

Untuk menyimpannya dalam variabel:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

Dan variabel dapat digunakan untuk mengatur kembali semua opsi:

$ eval "$storeoptions"

sumber
1

Untuk memeriksa opsi tertentu:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Bruce
sumber