Jak mogę wyświetlić opcje bash dla bieżącej powłoki?


27

Sam interpreter bash ma opcje, tj

Wiersze 22–23 strony podręcznika użytkownika 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 ...  

Użyłem kilku wzorców wyszukiwania na stronie podręcznika bash, takich jak:

  • /^\s*set
  • /list

Czy można wydrukować listę tych ustawień, które są zastosowane do bieżącej powłoki?

Odpowiedzi:


26
printf %s\\n "$-"

Wyświetli listę opcji z jedną literą w jednym ciągu.

Tego parametru można również użyć w następujący sposób:

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

Aby najpierw wyłączyć -frozszerzanie nazwy powłoki , jednocześnie zapisując wartość dla $-- jeśli w ogóle - w $1. Następnie nie występują globusy, a ostatnie +frozszerzenie nazwy jest ponownie włączone, a być może również wyłączone.

Na przykład, jeśli -frozszerzenie nazwy pliku było już wyłączone, gdy wartość parametru $-została zapisana po raz pierwszy, wówczas jego zapisaną wartością byłoby (przynajmniej) :

f

Dlatego po setponownym uruchomieniu działa:

set +f -f

Co po prostu przywraca Cię do początku.

set +o

Wyświetli listę wszystkich setopcji powłoki tabeli (patrz odpowiedź Jasona dla shoptmożliwości - czy to słowo? - opcje) w formie, która jest bezpieczna dla ponownego wejścia powłoki. W ten sposób możesz także:

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

Aby odpowiednio zapisać, zmienić i przywrócić stan opcji powłoki.

Aby obsłużyć shoptjony i setopcje tabeli za jednym razem:

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

Możesz także wywoływać set bez żadnych argumentów, aby dodać listę wszystkich aktualnie ustawionych zmiennych powłoki - również cytowanych w celu ponownego wejścia do powłoki. I możesz - w bash - dodatkowo dodać polecenie, typeset -fpaby uwzględnić również wszystkie aktualnie zadeklarowane funkcje powłoki. Możesz zebrać wszystko razem i evalkiedy będziesz gotowy. Możesz nawet zadzwonić aliasbez argumentów, aby uzyskać więcej tego samego. To ... może to jednak pokryć. Wydaje mi się, że istnieje "$@"- którą prawdopodobnie musiałbyś najpierw umieścić w bashtablicy, zanim to zrobisz set.

Nie, jest też trap. Ten jest trochę zabawny. Zwykle:

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

... po prostu wydrukuje to jest moja podpowłoka, ponieważ podpowłoka jest nowym procesem i pobiera własny zestaw traps - a więc nie dziedziczy żadnych traps, ale te, które jego rodzic wyraźnie zignorował - (jak trap '' INT) .

Jednak:

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

trapzachowuje się szczególnie, gdy jest to pierwsze i jedyne uruchomienie polecenia w podpowłoce zastępowania poleceń, ponieważ odtwarza listę aktualnie ustawionej powłoki nadrzędnej trapsw formacie cytowanym dla bezpiecznego ponownego wejścia do powłoki. Możesz więc zrobić save_traps, a następnie set bez argumentów - i całą resztę już wspomnianą - aby praktycznie zablokować cały stan powłoki. Możesz jednak jawnie dodać export -pi readonly -pprzywrócić oryginalne atrybuty var powłoki.

W każdym razie to wystarczy.


dzięki, twój kod działa dobrze. więc aby uzyskać pełną listę wszystkich opcji, musiałbyś użyć obu set +o i shopt ? (co do shoptbycia słowem, settablejest używane na stronie podręcznika, więc shoptabledziała dla mnie)
the_velour_fog

@ user4668401 - Myślę, że to zrobi.
mikeserv

TL; DR, ale +1000 dla rozwiązania 3-liniowego, aby zmienić opcję i odłożyć ją „tak, jak była”. To jest dokładnie to, czego trzeba, tworząc skrypty lub instrukcje kopiowania / pastowalne.
Balmipour,

@mikeserv Wydaje się, że należy dodać opcję -p podczas zapisywania stanu w celu uwzględnienia shoptjonów, tj.state=$(set +o;shopt -p)
nkatsar

9

Ze manstrony:

shopt
... Bez opcji lub z opcją -p wyświetlana jest lista wszystkich możliwych do ustawienia opcji ze wskazaniem, czy każda z nich jest ustawiona, czy nie.
shopt | grep on

wydrukuje listę wszystkich włączonych opcji.


działało, dzięki. Czy wiesz, czy zawiera listę opcji, które można ustawić zarówno przez, jak seti shopt?
the_velour_fog

@ user4668401 Nie, setjest o wiele bardziej rozbudowany: zobacz pozycję strony podręcznika man .
jasonwryan

I aby sprawdzić, czy jest włączona jedna opcja:shopt <option>
kos

będzie to obejmować opcje z „on” w nazwie (tj huponexit.). prosty sposób to naprawićshopt | grep on$
Mike D

6

Aby wyświetlić wszystkie opcje:

set -o

Aby sprawdzić konkretną opcję:

set -o | grep <OPTION>

Weź verboseprzykład jako przykład:

$ set -o | grep verbose
verbose         off

6

Opcje ?: Istnieją trzy grupy opcji w bash.

  1. Opcje odczytane lub ustawione przez polecenie set.
    (Użyj tego polecenia instrukcji: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Wszystkie opcje jedną literę:abefhkmnptuvxBCEHPT

    Również opcje (które nie mają odpowiednika jednej litery):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Opcje odczytane lub ustawione przez polecenie shopt.
    (Czytaj ręczny z tym poleceniem: LESS=+/'shopt \[-pqsu\]' man bash')
    Lista jest dość długa, ale łatwa do wydrukowania, przeznaczenie:

    $ shopt -p

    lub podobny (ale nie równy):

    $ shopt
  3. Opcje, które można ustawić na wezwanie:
    (komenda instrukcji: LESS=+/'^INVOCATION' man bash)

    Wszystkie setopcje:

    bash -abefhkmnptuvxBCEHPT

    Wszystkie shoptopcje

    bash -O option

    Niektóre opcje, które mają znaczenie tylko podczas INWOKOWANIA bash:

    bash -lirsDc

    A także (długie opcje):

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

Wszystkie setopcje jednej litery i -risą drukowane za pomocą $-.

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

Na przykład:

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

Wywołanie bash jako powłoki logowania jest zgłaszane tylko w shopt:

-l      Login
read with `shopt -p login_shell`

A zatem:

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

Opcji -nnie można przetestować za pomocą żadnego kodu, ponieważ oznacza to: nie wykonuj żadnego kodu.


Opcje drukowania

Najlepsze narzędzie do listy opcji działającej powłoki, zarówno ustawione za setpomocą, jak i ustawione za pomocą, shoptjest takie samo shopt. Aby wyświetlić listę ustawionych opcji:

shopt -o

Który działa dokładnie tak jak set -o. Użyj, shopt -poaby uzyskać taki sam wynik jak set +o.

Aby wyświetlić opcje shopt:

shopt -p

Z których możesz wydrukować te ustawione shopt -pslub wyłączoneshopt -pu

Aby uzyskać wszystkie opcje. O ile to możliwe, -sDcnie można wydrukować wielu długich opcji, a niektóre ( ) na INVOCATION:

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

Aby zapisać je w zmiennej:

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

Zmiennej można użyć do cofnięcia wszystkich opcji:

$ eval "$storeoptions"

1

Aby sprawdzić konkretną opcję:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.