Comment lister les options bash'es pour le shell actuel?

27

L'interprète bash lui-même a des options, c'est-à-dire

Lignes 22-23 de la page de manuel de 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 ...  

J'ai utilisé quelques modèles de recherche dans la page de manuel bash comme:

  • /^\s*set
  • /list

Est-il possible d'imprimer une liste de ces paramètres qui sont appliqués au shell actuel?

the_velour_fog
la source

Réponses:

26
printf %s\\n "$-"

Répertorie les options de lettre unique dans une seule chaîne.

Ce paramètre peut également être utilisé comme:

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

Pour désactiver d' -fabord l'expansion du nom de fichier du shell tout en enregistrant simultanément une valeur pour $-- le cas échéant - dans $1. Ensuite, aucun glob ne se produit et la dernière +fexpansion du nom de fichier est à nouveau activée, et peut-être également désactivée.

Par exemple, si l' -fextension de nom de fichier était déjà désactivée lors de la $-première sauvegarde de la valeur de , sa valeur enregistrée serait (au moins) :

f

Et donc quand il setest exécuté à nouveau, cela revient à:

set +f -f

Ce qui vous ramène là où vous avez commencé.

set +o

Répertoriera toutes setles options du shell de table (voir la réponse de Jason pour le shoptpouvoir - est-ce un mot? - options) sous une forme qui est sûre pour la rentrée du shell. De cette façon, vous pouvez également faire:

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

Pour enregistrer, modifier et restaurer respectivement l'état des options du shell.

Pour gérer les shoptions et setles options de table en une seule fois:

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

Vous pouvez également appeler set sans aucun argument pour ajouter une liste de toutes les variables actuellement définies du shell - également citées pour la réentrée dans le shell. Et vous pouvez - en bash - en plus ajouter la commande typeset -fppour inclure également toutes les fonctions shell actuellement déclarées. Vous pouvez tout regrouper et evalquand vous êtes prêt. Vous pouvez même appeler aliassans arguments pour plus de la même chose. Cela ... pourrait le couvrir, cependant. Je suppose qu'il y a "$@"- que vous devez d'abord mettre dans un bashtableau, je suppose, avant de le faire set.

Non, il y en a aussi trap. Celui-ci est un peu drôle. Habituellement:

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

... affichera simplement ceci est mon sous - shell parce que le sous-shell est un nouveau processus et obtient son propre ensemble de traps - et n'hérite donc pas de traps mais de ceux que son parent a explicitement ignorés - (comme trap '' INT) .

Toutefois:

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

trapse comporte spécialement lorsqu'il s'agit de la première et seule commande exécutée dans un sous-shell de substitution de commandes en ce sens qu'il reproduira une liste des shell parents actuellement définis trapsdans un format qui est cité pour une rentrée en toute sécurité dans le shell. Et donc vous pouvez faire le save_traps, puis set sans arguments - et tout le reste déjà mentionné - pour obtenir à peu près un verrou sur tous les états du shell. Cependant, vous souhaiterez peut-être ajouter export -pet readonly -prestaurer explicitement les attributs var var du shell d'origine.

Bref, ça suffit.

mikeserv
la source
merci, votre code fonctionne bien. donc pour obtenir une liste complète de toutes les options, vous devez utiliser les deux set +o et shopt ? (quant à shoptpouvoir être un mot, settableest utilisé dans la page de manuel, donc ça shoptablemarche pour moi)
the_velour_fog
@ user4668401 - Je pense que cela suffira.
mikeserv
TL; DR, mais +1000 pour la solution à 3 lignes pour changer une option et la remettre "telle quelle". C'est exactement ce dont on a besoin lors de la création de scripts ou d'instructions de copier / coller.
Balmipour
@mikeserv Il semble que l' option -p doit être ajoutée lors de l'enregistrement de l'état pour inclure les shoptions, c'eststate=$(set +o;shopt -p)
nkatsar
9

Depuis la manpage:

shopt
... Sans aucune option, ou avec l'option -p, une liste de toutes les options paramétrables s'affiche, avec une indication indiquant si chacune est définie ou non.
shopt | grep on

imprimera une liste de toutes les options activées.

jasonwryan
la source
cela a fonctionné, merci. Savez-vous si cela répertorie les options qui peuvent être définies à la fois par setet shopt?
the_velour_fog
@ user4668401 Non, setc'est beaucoup plus complet: voir l'entrée de la page de manuel .
jasonwryan
Et pour vérifier si une seule option est activée:shopt <option>
kos
cela inclura les opts avec 'on' dans le nom (ie huponexit). moyen simple de réparer estshopt | grep on$
Mike D
6

Pour répertorier toutes les options:

set -o

Pour inspecter une option spécifique:

set -o | grep <OPTION>

Prenez l'option verbosecomme exemple:

$ set -o | grep verbose
verbose         off
Jeremy Kao
la source
6

Options?: Il y a trois groupes d'options dans bash.

  1. Les options lues ou définies par la commande set.
    (Utiliser cette commande pour le manuel: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Toutes les options d' une lettre:abefhkmnptuvxBCEHPT

    Aussi les options (qui n'ont pas d'équivalent d'une seule lettre):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Les options lues ou définies par la commande shopt.
    (Lire le manuel avec cette commande: LESS=+/'shopt \[-pqsu\]' man bash')
    La liste est assez longue , mais facile à imprimer, utilisez:

    $ shopt -p

    ou similaire (mais pas égal):

    $ shopt
  3. Les options qui pourraient être définies sur INVOCATION
    (commande pour le manuel: LESS=+/'^INVOCATION' man bash)

    Toutes les setoptions:

    bash -abefhkmnptuvxBCEHPT

    Toutes les shoptoptions

    bash -O option

    Quelques options qui n'ont de sens que lorsque INVOKING bash:

    bash -lirsDc

    Et aussi (options longues):

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

Toutes les setoptions d'une lettre et -risont imprimées avec $-.

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

Par exemple:

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

L'appel de bash en tant que shell de connexion n'est signalé qu'avec shopt:

-l      Login
read with `shopt -p login_shell`

Ainsi:

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

L'option -nne peut être testée par aucun code, car elle signifie: n'exécutez aucun code.


Options d'impression

Le meilleur outil pour répertorier les options du shell en cours d'exécution , soit celles définies avec setou celles définies avec shoptest le même shopt. Pour répertorier les options définies:

shopt -o

Qui agit exactement comme set -o. Utilisez shopt -popour obtenir le même résultat que set +o.

Pour répertorier les options de shopt:

shopt -p

Dont vous pouvez choisir d'imprimer celles définies shopt -psou nonshopt -pu

Pour obtenir toutes les options. Autant que possible, autant d'options longues et certaines ( -sDc) sur INVOCATION ne peuvent pas être imprimées:

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

Pour les stocker dans une variable:

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

Et la variable pourrait être utilisée pour reculer toutes les options:

$ eval "$storeoptions"

la source
1

Pour inspecter une option spécifique:

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