if ["$ { - #*i}"!="$ - "]是什么意思?

KF *_*Lin 2 linux bash shell

在我的Oracle Linux框中,我发现了一块/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
Run Code Online (Sandbox Code Playgroud)

我的问题是在if语句中的变量${-#*i}$-.那是什么意思?为什么要添加else语句来重定向输出?谢谢!

imp*_*p25 8

$-是一个存储shell设置的当前选项变量.

${-#*i}正在使用子字符串删除来*i从变量的开头删除与模式的最短匹配.所以,如果$-有值abcifOO,然后${-#*i}fOO.(您可以在此处阅读有关bash子串的更多信息.)

这意味着测试

[ "${-#*i}" != "$-" ]
Run Code Online (Sandbox Code Playgroud)

如果变量$-包含选项i,则为true ,这表示交互模式已打开.

总之,这意味着只有/dev/null在处于交互模式时才会将输出重定向到.