Я /etc/profile
вижу это:
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
Что ${-#*i}
значит. Я не могу найти определение расширения параметра, начиная с ${-
.
решение1
$-
текущие флаги опций, установленные самой оболочкой, при вызове или с помощью set
встроенной команды:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
синтаксис для удаления строки: (изДокументация POSIX)
${параметр#[слово]}
Удалить наименьший префиксный шаблон. Слово должно быть расширено для создания шаблона. Расширение параметра должно затем привести к параметру, при этом наименьшая часть префикса, соответствующая шаблону, будет удалена. Если присутствует, слово не должно начинаться с незакавыченного символа '#'.
${параметр##[слово]}
Удалить самый большой шаблон префикса. Слово должно быть расширено для создания шаблона. Расширение параметра должно затем привести к параметру, при этом наибольшая часть префикса, соответствующая шаблону, будет удалена.
Итак, ${-#*i}
удалите самую короткую строку до первого i
символа:
$ echo "${-#*i}"
mBH
В вашем случае if [ "${-#*i}" != "$-" ]
проверяется, является ли ваша оболочка интерактивной или нет.
решение2
Есть параметр оболочки $-
. В моем случае:
$ echo $-
himB
${-}
то же самое, $-
что и . ${foo}
то же самое, что и $foo
.
#*i
означает: удалить (как можно меньше; здесь это не имеет значения) от начала значения переменной до (включая) первого i
.
$ echo "${-#*i}"
mB
Другими словами: [ "${-#*i}" != "$-" ]
проверяет, есть ли i
в значении переменной $-
, то есть проверяет, является ли оболочка интерактивной.
Другими словами, это запутанный и несовместимый с Борном способ записи:
case $- in
*i*) ...;;
*) ...;;
esac