Was bedeutet "$ {- # * i}"! = "$ -"?

37

Darin /etc/profilesehe ich Folgendes:

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

Was heißt ${-#*i}das ? Ich kann keine Definition einer beginnenden Parametererweiterung finden ${-.

Pete
quelle

Antworten:

40

$-Die aktuellen Optionsflags werden von der Shell selbst, beim Aufrufen oder mithilfe des setintegrierten Befehls festgelegt:

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

"${-#*i}"lautet die Syntax zum Entfernen von Zeichenfolgen: (aus der POSIX-Dokumentation )

$ {parameter # [word]}

Kleinstes Präfixmuster entfernen. Das Wort soll zu einem Muster erweitert werden. Die Parametererweiterung ergibt dann einen Parameter, wobei der kleinste Teil des Präfixes mit dem gelöschten Muster übereinstimmt. Wenn vorhanden, darf das Wort nicht mit einem nicht zitierten '#' beginnen.

$ {parameter ## [word]}

Größtes Präfixmuster entfernen. Das Wort soll zu einem Muster erweitert werden. Die Parametererweiterung ergibt dann einen Parameter, wobei der größte Teil des Präfixes mit dem gelöschten Muster übereinstimmt.

Also ${-#*i}entferne die kürzeste Zeichenkette bis zum ersten iZeichen:

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

if [ "${-#*i}" != "$-" ]Überprüfen Sie in Ihrem Fall, ob Ihre Shell interaktiv ist oder nicht.

cuonglm
quelle
23

Es gibt einen Shell-Parameter $-. In meinem Fall:

$ echo $-
himB

${-}ist das gleiche wie $-genau wie ${foo}ist das gleiche wie $foo.

#*ibedeutet: Löschen (so wenig wie möglich; macht hier keinen Unterschied) vom Anfang des Variablenwerts bis zum ersten (einschließlich) i.

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

Mit anderen Worten: [ "${-#*i}" != "$-" ]Überprüft, ob ider Wert der $-Variablen einen enthält, dh, ob die Shell interaktiv ist.

Mit anderen Worten, es ist eine verschlungene und nicht Bourne-kompatible Art zu schreiben:

case $- in
  *i*) ...;;
  *) ...;;
esac
Hauke ​​Laging
quelle
4
Es ist jedoch POSIX-kompatibel .
Grawity