Wie kann ich bash'es Optionen für die aktuelle Shell auflisten?

27

Der Bash-Interpreter selbst hat Optionen, dh

Zeilen 22-23 von bashs Manpage:

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

Ich habe ein paar Suchmuster in der Bash-Manpage verwendet, wie:

  • /^\s*set
  • /list

Ist es möglich, eine Liste dieser Einstellungen zu drucken, die auf die aktuelle Shell angewendet werden?

the_velour_fog
quelle

Antworten:

26
printf %s\\n "$-"

Listet die Optionen für einzelne Buchstaben in einer einzelnen Zeichenfolge auf.

Dieser Parameter kann auch wie folgt verwendet werden:

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

Deaktivieren Sie -fzuerst die Erweiterung des Shell- Dateinamens, während Sie gleichzeitig einen Wert für $-- falls vorhanden - in speichern $1. Als nächstes treten keine Globs auf, und die +fErweiterung des letzten Dateinamens wird erneut aktiviert und möglicherweise auch deaktiviert.

Wenn beispielsweise die -fDateinamenerweiterung bereits deaktiviert war, als der Wert für $-zum ersten Mal gespeichert wurde, lautet der gespeicherte Wert (mindestens) :

f

Wenn setalso erneut ausgeführt wird, funktioniert Folgendes:

set +f -f

Damit bist du wieder da, wo du angefangen hast.

set +o

Listet alle setOptionen der Tabellen-Shell (siehe Jasons Antwort für dieshopt Optionen "Ist das ein Wort?") In einer Form auf, die für den Wiedereintritt in die Shell sicher ist. Auf diese Weise können Sie auch Folgendes tun:

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

Zum Speichern, Ändern und Wiederherstellen des jeweiligen Status der Shell-Optionen.

So bearbeiten Sie shoptIonen und setTabellenoptionen auf einmal:

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

Sie können auch set ohne Argumente aufrufen , um eine Liste aller aktuell eingestellten Variablen der Shell hinzuzufügen - auch für den Wiedereintritt in die Shell in Anführungszeichen gesetzt. Und Sie können - in bash - zusätzlich den Befehl hinzufügen, typeset -fpum auch alle aktuell deklarierten Shell-Funktionen einzuschließen. Sie können alles zusammenfassen und evalwenn Sie fertig sind. Sie können sogar aliasohne Argumente mehr davon aufrufen . Das ... könnte es aber verdecken. Ich denke, es gibt "$@"- die müssten Sie bashzuerst in ein Array setzen, nehme ich an, bevor Sie tun set.

Nein, es gibt auch trap. Das ist ein bisschen lustig. Meistens:

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

... drucke nur, das ist meine Subshell, weil die Subshell ein neuer Prozess ist und einen eigenen Satz von traps bekommt - und deshalb keine erbttrap s, sondern nur die, die die Eltern explizit ignoriert haben - (wie trap '' INT) .

Jedoch:

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

trapVerhält sich besonders dann, wenn es der erste und einzige Befehl ist, der in einer Befehlsersetzungs-Subshell ausgeführt wird, da eine Liste der aktuell festgelegten übergeordneten Shell trapsin einem Format reproduziert wird, das für den sicheren Wiedereintritt in die Shell in Anführungszeichen gesetzt ist. Und so können Sie das tun save_traps, dann set ohne Argumente - und der ganze Rest bereits erwähnt - auf so ziemlich eine Sperre für alle Shell - Zustand erhalten. Möglicherweise möchten Sie jedoch die ursprünglichen Shell-Var-Attribute explizit hinzufügen export -pund readonly -pwiederherstellen.

Jedenfalls ist das genug.

mikeserv
quelle
Danke, Ihr Code funktioniert gut. Um eine vollständige Liste aller Optionen zu erhalten, müssten Sie also beides set +o und shopt ? verwenden. ( shoptsettableshoptable
Was die Fähigkeit betrifft
@ user4668401 - Ich denke das wird es tun.
mikeserv
TL; DR, aber +1000 für die 3-Zeilen-Lösung, um eine Option zu ändern und sie so zurückzusetzen, wie sie war. Das ist genau das, was man braucht, wenn man Skripte erstellt oder Anweisungen kopiert / einfügt.
Balmipour
@mikeserv Scheint, dass die Option -p hinzugefügt werden muss, wenn der Zustand shoptstate=$(set +o;shopt -p)
gespeichert wird
9

Von der manSeite:

shopt
... Ohne Optionen oder mit der Option -p wird eine Liste aller einstellbaren Optionen angezeigt, die angibt, ob die einzelnen Optionen festgelegt sind oder nicht.
shopt | grep on

druckt eine Liste aller aktivierten Optionen.

jasonwryan
quelle
das hat funktioniert, danke. Wissen Sie, ob in dieser Liste die Optionen aufgeführt sind, die von setund eingestellt werden können shopt?
the_velour_fog
@ user4668401 Nein, setist weitaus umfangreicher: siehe Manpage-Eintrag .
Jasonwryan
Und um zu überprüfen, ob eine einzelne Option shopt <option>
aktiviert
Dies schließt Optionen mit "Ein" im Namen (dh huponexit) ein. einfache Möglichkeit, dies zu beheben, istshopt | grep on$
Mike D
6

So listen Sie alle Optionen auf:

set -o

So überprüfen Sie eine bestimmte Option:

set -o | grep <OPTION>

Nehmen Sie die Option verboseals Beispiel:

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

Optionen ?: In bash gibt es drei Gruppen von Optionen.

  1. Die vom Befehl gelesenen oder gesetzten Optionen set.
    (Verwenden Sie diesen Befehl für die manuelle: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Alle Ein-Buchstaben - Optionen:abefhkmnptuvxBCEHPT

    Auch die Optionen (die kein einziges Buchstabenäquivalent haben):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Die vom Befehl gelesenen oder gesetzten Optionen shopt.
    (Lesen Sie das Handbuch mit diesem Befehl: LESS=+/'shopt \[-pqsu\]' man bash')
    Die Liste ist ziemlich lang , aber einfach, Gebrauch zu drucken:

    $ shopt -p

    oder ähnlich (aber nicht gleich):

    $ shopt
  3. Die Optionen , die auf INVOCATION eingestellt werden könnte:
    (Befehl für die manuelle: LESS=+/'^INVOCATION' man bash)

    Alle setOptionen:

    bash -abefhkmnptuvxBCEHPT

    Alle shoptMöglichkeiten

    bash -O option

    Einige Optionen, die nur beim Aufrufen von bash von Bedeutung sind:

    bash -lirsDc

    Und auch (lange Optionen):

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

Alle setEin-Buchstaben-Optionen und -riwerden mit gedruckt $-.

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

Beispielsweise:

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

Der Aufruf von bash als Login-Shell wird nur mit shopt gemeldet:

-l      Login
read with `shopt -p login_shell`

Somit:

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

Die Option -nkann von keinem Code getestet werden, da dies bedeutet, dass kein Code ausgeführt wird.


Druckoptionen

Das beste Werkzeug, um die Optionen der laufenden Shell aufzulisten, entweder die mit setoder die mit eingestellten, shoptist das gleiche shopt. So listen Sie festgelegte Optionen auf:

shopt -o

Welches wirkt genau wie set -o. Verwenden Sie shopt -po, um das gleiche Ergebnis zu erhalten wie set +o.

So listen Sie die Shopt-Optionen auf:

shopt -p

Von denen Sie wählen können, ob Sie die eingestellten shopt -psoder die nicht eingestellten drucken möchtenshopt -pu

Um alle Möglichkeiten zu bekommen. Möglichst viele lange Optionen und einige ( -sDc) in INVOCATION können nicht gedruckt werden:

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

So speichern Sie sie in einer Variablen:

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

Und die Variable könnte verwendet werden, um alle Optionen zurückzusetzen:

$ eval "$storeoptions"

quelle
1

So überprüfen Sie eine bestimmte Option:

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