在/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
$-
是 shell 本身在调用时或使用set
内置命令设置的当前选项标志:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
是字符串删除的语法:(来自POSIX 文档)
${参数#[字]}
删除最小前缀模式。该词应扩展以产生一种模式。然后,参数扩展应产生参数,其中前缀的最小部分与删除的模式匹配。如果存在,单词不得以不带引号的“#”开头。
${参数##[字]}
删除最大前缀模式。该词应扩展以产生一种模式。然后,参数扩展应产生参数,其中前缀的最大部分与删除的模式匹配。
因此${-#*i}
删除最短的字符串直到第一个i
字符:
$ echo "${-#*i}"
mBH
对于您的情况,if [ "${-#*i}" != "$-" ]
检查您的 shell 是否是交互式的。
答案2
有一个shell参数$-
。就我而言:
$ echo $-
himB
${-}
与$-
完全一样${foo}
与 相同$foo
。
#*i
意思是:从变量值的开头删除(尽可能少;这里没有区别)直到(包括)第一个i
.
$ echo "${-#*i}"
mB
换句话说:检查变量的值中[ "${-#*i}" != "$-" ]
是否有an ,即检查shell是否是交互式的。i
$-
换句话说,这是一种复杂且与 Bourne 不兼容的编写方式:
case $- in
*i*) ...;;
*) ...;;
esac