Réponses:
$-
Les indicateurs d'option actuels sont-ils définis par le shell lui-même, lors de l'appel ou à l'aide de la set
commande 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 i
caractère:
$ echo "${-#*i}"
mBH
Dans votre cas, if [ "${-#*i}" != "$-" ]
vérifier si votre shell est interactif ou non.
Il y a un paramètre shell $-
. Dans mon cas:
$ echo $-
himB
${-}
est identique à $-
exactement ${foo}
identique à $foo
.
#*i
signifie: 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 i
dans 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