Odpowiedzi:
$-
to bieżące flagi opcji ustawione przez samą powłokę, podczas wywołania lub za pomocą set
wbudowanego polecenia:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
jest składnią do usuwania ciągów: (z dokumentacji POSIX )
$ {parametr # [słowo]}
Usuń najmniejszy wzór prefiksu. Słowo należy rozwinąć, aby uzyskać wzór. Rozszerzanie parametru powinno następnie skutkować parametrem, przy czym najmniejsza część prefiksu jest dopasowana do wzorca usuniętego. Jeśli występuje, słowo nie może zaczynać się od cudzysłowu „#”.
$ {parametr ## [słowo]}
Usuń największy wzór prefiksu. Słowo należy rozwinąć, aby uzyskać wzór. Rozszerzanie parametru powinno następnie skutkować parametrem, przy czym największą część prefiksu dopasowuje wzorzec usunięty.
Więc ${-#*i}
usuń najkrótszy ciąg do pierwszego i
znaku:
$ echo "${-#*i}"
mBH
W twoim przypadku if [ "${-#*i}" != "$-" ]
sprawdzenie, czy twoja powłoka jest interaktywna, czy nie.
Istnieje parametr powłoki $-
. W moim przypadku:
$ echo $-
himB
${-}
jest taki sam jak $-
dokładnie tak samo jak ${foo}
jest taki sam jak $foo
.
#*i
oznacza: Usuń (tak mało, jak to możliwe; tutaj nie robi różnicy) od początku wartości zmiennej do (włącznie) pierwszej i
.
$ echo "${-#*i}"
mB
Innymi słowy: [ "${-#*i}" != "$-" ]
sprawdza, czy i
wartość jest $-
zawarta w zmiennej, to znaczy sprawdza, czy powłoka jest interaktywna.
Innymi słowy, jest to skomplikowany i niekompatybilny z Bourne'em sposób pisania:
case $- in
*i*) ...;;
*) ...;;
esac