Antworten:
$-
Die aktuellen Optionsflags werden von der Shell selbst, beim Aufrufen oder mithilfe des set
integrierten 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 i
Zeichen:
$ echo "${-#*i}"
mBH
if [ "${-#*i}" != "$-" ]
Überprüfen Sie in Ihrem Fall, ob Ihre Shell interaktiv ist oder nicht.
Es gibt einen Shell-Parameter $-
. In meinem Fall:
$ echo $-
himB
${-}
ist das gleiche wie $-
genau wie ${foo}
ist das gleiche wie $foo
.
#*i
bedeutet: 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 i
der 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