在我的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语句来重定向输出?谢谢!
$-
是一个存储shell设置的当前选项的变量.
${-#*i}
正在使用子字符串删除来*i
从变量的开头删除与模式的最短匹配.所以,如果$-
有值abcifOO
,然后${-#*i}
将fOO
.(您可以在此处阅读有关bash子串的更多信息.)
这意味着测试
[ "${-#*i}" != "$-" ]
Run Code Online (Sandbox Code Playgroud)
如果变量$-
包含选项i
,则为true ,这表示交互模式已打开.
总之,这意味着只有/dev/null
在处于交互模式时才会将输出重定向到.
归档时间: |
|
查看次数: |
531 次 |
最近记录: |