Que signifie “$ {- # * i}”! = “$ -”?


37

Dans /etc/profileje vois ceci:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

Que veut ${-#*i}dire. Je ne parviens pas à trouver la définition d’un paramètre d’expansion commençant ${-.

Réponses:


40

$-Les indicateurs d'option actuels sont-ils définis par le shell lui-même, lors de l'appel ou à l'aide de la setcommande intégrée:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"est la syntaxe pour la suppression de chaîne: (de la documentation POSIX )

$ {paramètre # [mot]}

Supprimer le plus petit motif de préfixe. Le mot doit être développé pour produire un motif. Le paramètre expansion doit alors donner lieu à paramètre, la plus petite partie du préfixe correspondant au modèle étant supprimée. S'il est présent, le mot ne doit pas commencer par un '#' non cité.

$ {paramètre ## [mot]}

Supprimer le plus grand modèle de préfixe. Le mot doit être développé pour produire un motif. Le paramètre expansion doit alors donner lieu à paramètre, la plus grande partie du préfixe correspondant au modèle étant supprimée.

Alors ${-#*i}supprimez la chaîne la plus courte jusqu'au premier icaractère:

$ echo "${-#*i}"
mBH

Dans votre cas, if [ "${-#*i}" != "$-" ]vérifier si votre shell est interactif ou non.


23

Il y a un paramètre shell $-. Dans mon cas:

$ echo $-
himB

${-}est identique à $-exactement ${foo}identique à $foo.

#*isignifie: Supprimer (le moins possible; ne fait pas de différence ici) du début de la valeur de la variable jusqu'au (y compris) la première i.

$ echo "${-#*i}"
mB

En d'autres termes: [ "${-#*i}" != "$-" ]vérifie s'il y a un idans la valeur de la $-variable, c'est-à-dire qu'il vérifie si le shell est interactif.

En d’autres termes, c’est une manière compliquée et non compatible avec Bourne d’écrire:

case $- in
  *i*) ...;;
  *) ...;;
esac

4
Il est compatible POSIX , cependant.
Grawity
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.