Geçerli kabuk için bash'lerin seçeneklerini nasıl listeleyebilirim?


27

Bash intepreter kendisi seçenekleri vardır, yani

Bash'ın man sayfasının 22-23. Satırları:

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 ...  

Bash man sayfasında aşağıdaki gibi birkaç arama modeli kullandım:

  • /^\s*set
  • /list

Geçerli kabuğa uygulanan bu ayarların bir listesini yazdırmak mümkün mü?

Yanıtlar:


26
printf %s\\n "$-"

Tek harfli seçenekler tek bir dizede listelenir.

Bu parametre aşağıdaki gibi de kullanılabilir:

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

İlk önce kabuk -filename genişlemesini devre dışı bırakmak için eşzamanlı olarak $-- varsa - için bir değer kaydederken $1. Daha sonra, hiçbir +fglob oluşmaz ve son dosya adı genişletme bir kez daha etkinleştirilir ve muhtemelen devre dışı bırakılır.

Örneğin , ilk önce -fdeğer $-kaydedildiğinde ilename genişlemesi zaten devre dışı bırakılmışsa , kaydedilen değeri şöyle olacaktır (en azından) :

f

Ve böylece settekrar çalıştırıldığında, şöyle çalışır:

set +f -f

Hangi sadece seni başladığın yere geri koyar.

set +o

Tüm listeler settablo kabuk seçeneklerini (bkz Jason'ın cevabını için shoptmümkün - o da bir kelime? - seçenekler) kabuk yeniden giriş için güvenli bir biçimde. Bu şekilde şunları da yapabilirsiniz:

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

Sırasıyla kabuk seçeneklerinin durumunu kaydetmek, değiştirmek ve geri yüklemek için.

shoptİyonları ve settablo seçeneklerini tek seferde işlemek için :

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

Ayrıca , kabuğun şu anda ayarlanan değişkenlerinin bir listesini eklemek için herhangi bir argüman set olmadan da çağrı yapabilirsiniz - kabuğa tekrar giriş yapmak için de verilir. Ve - bash - ayrıca typeset -fpşu anda bildirilen tüm kabuk işlevlerini de içerecek şekilde komutu ekleyebilirsiniz . Hepsini bir araya getirip evalhazır olduğunuzda toplayabilirsiniz . aliasAynısı için argümanlar olmadan bile çağrı yapabilirsiniz. Bu ... olsa da örtbas edebilir. Sanırım var "$@"- ki bunu bashyapmadan önce ilk önce bir diziye koymak zorunda kalacaksınız set.

Hayır, ayrıca var trap. Bu biraz komik. Genellikle:

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

... sadece yazdırılır bu benim alt kabuktur altkabuk yeni bir süreç olup kendi belirledi alır çünkü traps - herhangi miras kalmaması ve trap- s ancak üst açıkça göz ardı ettiği bu (gibi trap '' INT) .

Ancak:

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

trapbir komut değiştirme alt kabuğunda çalıştırılan ilk ve tek komut olduğunda özel olarak davranır, çünkü şu anda ana kabuğun trapsgüvenli bir şekilde tekrar girmesi için alıntılanan bir biçimde ayarlanmış olan ana kabuğun bir listesini üretir . Yapabileceğiniz böylece Ve save_traps, daha sonra set değişkenler olmadan - dinlenme ve tüm Daha önce bahsedildiği - hemen hemen tüm kabuk durumuna kilitlenmek için. Açıkça eklemek export -pve readonly -porijinal kabuk var niteliklerini geri yüklemek isteyebilirsiniz .

Neyse, bu kadar yeter.


teşekkürler, kodunuz iyi çalışıyor. Böylece tüm seçeneklerinin tam listesini almak için, her iki kullanması gerekir set +o ve shopt ? ( shoptbir kelime yapabilmek için settable, man sayfasında kullanılır, bu yüzden shoptablebenim için çalışır)
the_velour_fog

@ user4668401 - Bunu yapacağını düşünüyorum.
mikeserv

TL; DR, ancak 3 satırlık çözüm için +1000 bir seçeneği değiştirip 'olduğu gibi' geri koydu. Bu, komut dosyaları veya kopyalama / yapıştırma talimatları oluştururken tam olarak ihtiyaç duyduğu şeydir.
Balmipour

@mikeserv İyonları içerecek şekilde devlet kaydederken -p seçeneğinin eklenmesi gerektiğini düşünüyor shopt, yanistate=$(set +o;shopt -p)
nkatsar

9

Sayfadan man:

shopt
... Hiçbir seçenek olmadan veya -p seçeneğiyle, her birinin ayarlanıp ayarlanmadığını belirten, tüm ayarlanabilir seçeneklerin bir listesi görüntülenir.
shopt | grep on

Tüm etkin seçeneklerin bir listesini yazdıracaktır.


işe yaradı, teşekkürler. Bunun hem setve hem de tarafından ayarlanabilir seçenekleri listelediğini biliyor musunuz shopt?
the_velour_fog

@ user4668401 Hayır, setçok daha kapsamlı: man sayfası girişine bakın .
jasonwryan

Tek bir seçeneğin açık olup olmadığını kontrol etmek için:shopt <option>
kos

Bu, isminde 'açık' olan seçimleri içerecektir (yani huponexit). düzeltmek için basit bir yoldurshopt | grep on$
Mike D

6

Tüm seçenekleri listelemek için:

set -o

Belirli bir seçeneği incelemek için:

set -o | grep <OPTION>

Seçeneği verboseörnek olarak alın :

$ set -o | grep verbose
verbose         off

6

Seçenekler ?: bash'ta üç seçenek grubu vardır.

  1. Seçenekler komut tarafından okunur veya ayarlanır set.
    (Manuel için bu komutu kullanın: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Hepsi tek harfli seçenekleri:abefhkmnptuvxBCEHPT

    Ayrıca seçenekler (tek bir harf eşdeğeri olmayan):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Seçenekler komut tarafından okunur veya ayarlanır shopt.
    (Bu komutla manuel okuyun: LESS=+/'shopt \[-pqsu\]' man bash')
    liste oldukça uzun ama kolay, kullanımı yazdırmak için:

    $ shopt -p

    veya benzerleri (ancak eşit değil):

    $ shopt
  3. : Çağırma kurulabileceği seçenekleri
    (manuel için komut: LESS=+/'^INVOCATION' man bash)

    Tüm setseçenekler:

    bash -abefhkmnptuvxBCEHPT

    Tüm shoptseçenekler

    bash -O option

    Sadece INVOKING bash iken anlamlı olan bazı seçenekler:

    bash -lirsDc

    Ve ayrıca (uzun seçenekler):

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

Tüm settek harf seçenekleri ve -riile basılmıştır $-.

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

Örneğin:

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

Bir giriş kabuğu olarak bash çağrısı sadece shopt ile bildirilir:

-l      Login
read with `shopt -p login_shell`

Böylece:

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

Seçenek -nşu anlama gelir: herhangi bir kodla test edilemez:


Baskı seçenekleri

Çalışan kabuğun seçeneklerini listelemek için en iyi araç , ya ayarlanmış olanlarla setya da ayarlananlarla shoptaynıdır shopt. Set seçeneklerini listelemek için:

shopt -o

Tam olarak aynı şekilde hareket eder set -o. İle shopt -poaynı sonucu almak için kullanın set +o.

Mağaza seçeneklerini listelemek için:

shopt -p

Bunlardan birini shopt -psveya setini yazdırmayı seçebilirsiniz.shopt -pu

Tüm seçenekleri almak için. Mümkün olduğunca uzun seçenekler ve -sDcINVOCATION üzerindeki bazı ( ) basılamaz:

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

Bunları bir değişkende saklamak için:

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

Ve değişken tüm seçenekleri geri koymak için kullanılabilir:

$ eval "$storeoptions"

1

Belirli bir seçeneği incelemek için:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.