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 ${-.

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.


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

4
Es ist jedoch POSIX-kompatibel .
Grawity
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.