Ответы:
$-
это флаги текущей опции, установленные самой оболочкой, при вызове или с помощью set
встроенной команды:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
такое синтаксис для удаления строки: (из документации POSIX )
$ {Параметр # [слово]}
Удалите самый маленький образец префикса. Слово должно быть расширено, чтобы произвести образец. Расширение параметра должно затем привести к параметру с наименьшей частью префикса, совпадающей с удаленным шаблоном. Если присутствует, слово не должно начинаться с кавычки без кавычек.
$ {Параметр ## [слово]}
Удалить самый большой образец префикса. Слово должно быть расширено, чтобы произвести образец. Расширение параметра должно затем привести к параметру, при этом наибольшая часть префикса соответствует удаленному шаблону.
Поэтому ${-#*i}
удалите самую короткую строку до первого i
символа:
$ echo "${-#*i}"
mBH
В вашем случае if [ "${-#*i}" != "$-" ]
проверка, является ли ваша оболочка интерактивной или нет.
Есть параметр оболочки $-
. В моем случае:
$ echo $-
himB
${-}
так же, как $-
точно так ${foo}
же, как и $foo
.
#*i
означает: Удалить (как можно меньше; здесь не имеет значения) от начала значения переменной до (включая) первого i
.
$ echo "${-#*i}"
mB
Другими словами: [ "${-#*i}" != "$-" ]
проверяет, есть ли i
в значении $-
переменной значение, то есть проверяет, является ли оболочка интерактивной.
Другими словами, это запутанный и не Bourne-совместимый способ написать:
case $- in
*i*) ...;;
*) ...;;
esac