web-dev-qa-db-fra.com

Comment puis-je énumérer des options Bash'es pour la coquille actuelle?

L'intepreter Bash a-t-il des options, c'est-à-dire.

Lignes 22-23 de Bash's Man Page:

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 motifs de recherche dans la page Bash Man, comme:

  • /^\s*set
  • /list

Est-il possible d'imprimer une liste de ces paramètres appliqués à la coque actuelle?

29
the_velour_fog
printf %s\\n "$-"

Liste des 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 "$@"

D'abord Désactiver la coque -f expansion d'ilename tout en enregistrant simultanément une valeur pour $- - si tout - dans $1. Ensuite, aucun globe ne se produit et le dernier +f _ ilename expansion est à nouveau activé et éventuellement également désactivé.

Par exemple, si -f ilename expansion était déjà désactivé lorsque la valeur pour $- a été sauvegardée, puis sa valeur enregistrée serait (au moins):

f

Et alors quand set est à nouveau exécuté, cela fonctionne à:

set +f -f

Ce qui vous met simplement votre retour là où vous avez commencé.

set +o

Listera tous les options de shell set [~ var _] (voir Réponse de Jason pour le shoptable - est-ce un mot? - Options) sous une forme qui est sûre pour la refoulement de la coque. De cette façon, vous pouvez également faire:

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

Pour enregistrer, changer et restaurer l'état des options de shell, respectivement.

Pour gérer les shoptions et settable options en une fois:

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

Vous pouvez également appeler set sans Tout argument pour ajouter une liste de toutes les variables actuellement définies de la coque - également citée pour la refoulement à la coquille. Et vous pouvez - en bash - ajoutez en outre la commande typeset -fp Pour inclure également toutes les fonctions de shell actuellement déclarées. Vous pouvez tout grouper ensemble et eval lorsque vous êtes prêt. Vous pouvez même appeler alias sans argument 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 bash tableau, je suppose, avant de faire set.

Nope, il y a aussi trap. Celui-ci est un peu drôle. D'habitude:

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

... Je vais simplement imprimer Ceci est mon sous-vase Parce que le sous-groupe est un nouveau processus et obtient son propre ensemble de traps - et donc n'hérite pas d'hériter de traps mais ceux que son parent a explicitement ignoré - (comme trap '' INT).

Toutefois:

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

trap se comporte spécialement quand il est le premier and seulement Commande exécutée dans un sous-riche de substitution de commande en ce sens qu'il reproduira une liste de la coque mère actuellement définie traps Dans un format qui est cité pour une refoulement de sécurité à la coquille. Et afin que vous puissiez faire le save_traps, alorsset sans arguments - et tout le reste déjà mentionné - pour obtenir à peu près une serrure de tous État shell. Vous voudrez peut-être explicitement ajouter export -p _ et readonly -p pour restaurer des attributs d'origine de Shell Var, cependant.

Quoi qu'il en soit, ça suffit.

27
mikeserv

De la page man:

boutique
... sans options, ou avec l'option -p, une liste de toutes les options réglantes est affichée, avec une indication de chaque définition ou non.
shopt | grep on

imprimera une liste de toutes les options activées.

9
jasonwryan

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

  1. Les options sont lues ou définies par la commande set.
    [.____] (Utilisez 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 de 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 sont lues ou définies par la commande shopt.
    (Lisez le manuel avec cette commande: LESS=+/'shopt \[-pqsu\]' man bash')
    [.____] La liste est assez longue mais facile à imprimer, utilisez:

    $ shopt -p
    

    ou le similaire (mais pas égal):

    $ shopt
    
  3. Les options pouvant être définies sur l'invocation:
    [.____] (commande pour le manuel: LESS=+/'^INVOCATION' man bash)

    Tous set options:

    bash -abefhkmnptuvxBCEHPT
    

    Tous shopt options

    bash -O option
    

    Quelques options qui ne sont significatives que lorsque vous invoquez Bash:

    bash -lirsDc
    

    Et aussi (options longues):

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

Tous set Options d'une lettre et -ri sont imprimés 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

Appeler Bash en tant que shell de connexion est seulement signalé 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 -n ne peut pas être testé par aucun code, car cela signifie: n'exécutez aucun code.


Options d'impression

Le meilleur outil permettant de répertorie les options de la coquille exécutant, soit celle définie avec set _ ou celles définies avec shopt est le même shopt . Pour répertorier les options de définition:

shopt -o

Qui agit exactement comme set -o. Utilisation shopt -po Pour obtenir le même résultat que set +o.

Pour énumérer les options shopt:

shopt -p

Dont vous pouvez choisir d'imprimer soit celui de celles définis shopt -ps ou non défini shopt -pu

Obtenir toutes les options. Autant que possible autant d'options longues et de certaines (-sDc) sur l'invocation ne peut pas être imprimé:

$ 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 définir toutes les options:

$ eval "$storeoptions"
7
user184899

Pour répertorier toutes les options:

set -o

Pour inspecter une option spécifique:

set -o | grep <OPTION>

Prenez l'option verbose comme exemple:

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

Pour inspecter une option spécifique:

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