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

标签 bash

我在查看/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/

相关文章:

bash - 用awk中的换行符替换 "\n"

linux - 如何告诉 bash 从自定义位置获取 gettext .mo 文件?

bash - awk 替换 shell 变量

linux - bash 中的 sudo,权限被拒绝

ios - iOS 上新行附近的 Bash 语法错误

json - 如何使用 `jq`获取 key

python - 为什么 python shebang 不接受三个以上的参数?

python - 找不到 Bazel 构建包

linux - 我什么时候可以在 bash、ubuntu 中使用命令 ". shellscript"运行 shell 脚本?

bash - sed,引号中的正斜杠