我在查看/etc/profile 文件时发现了一个奇怪的 if 语句。谁能告诉我这是什么意思?
我指的是第二个 if 语句 if [ "${-#*i}"!= "$-"]
。
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
最佳答案
$-
输出 shell 运行时使用的选项列表。 $-
输出中的 i
表示 shell 是交互式的。
${var#expr}
从 var
的值中删除左侧与 expr
匹配的部分。 expr
是一个全局变量。如果expr
不匹配,则直接输出原始字符串。
因此,${-#*i}
获取$-
的值,并删除左侧与*i
匹配的部分。
例如:$-
是 himBHs
。左边与*i
匹配的部分是hi
。因此左侧的 hi
将被删除。因此 ${-#*i}
将是 mBHs
。
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Can someone let me know what this means?
我认为这是一种检查 session 是否交互式的奇怪方法。
为了可读性和可移植性,我非常喜欢并推荐case "$-"in *i*)
。另外https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html .
关于bash - `if [ "${-#*i }"!= "$ -"]` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70641273/