1

在 scp 出现一些问题(显然,它不喜欢我的.bashrc文件中存在 bash bind 命令)之后,我听从了互联网上一个聪明人的建议(我现在找不到那个帖子)放在顶部它的.bashrc文件是这样的:

[[ ${-#*i} != ${-} ]] || return

为了确保除非在交互式会话中,否则不会执行 bash 初始化。

现在,这行得通。但是,我无法弄清楚它是如何工作的。你能启发我吗?

根据这个答案,这$-是为shell设置的当前选项,我知道这${}是用于扩展变量的所谓“子字符串”语法。

但是,我不明白这${-#*i}部分。和为什么$-#*i不一样${-#*i}

4

2 回答 2

5
${parameter#word}
${parameter##word}

单词被扩展以产生一个模式,就像在文件名扩展中一样。如果模式匹配参数扩展值的开头,则扩展结果是具有最短匹配模式('#' 情况)或最长匹配模式('##' 情况)的参数扩展值删除。如果 parameter 是 '@' 或 '<em>',则模式移除操作将依次应用于每个位置参数,并且展开是结果列表。如果 parameter 是下标为 '@' 或 '</em>' 的数组变量,模式删除操作将依次应用于数组的每个成员,展开是结果列表。

来源:http ://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

所以基本上发生的事情${-#*i}就是*i被扩展,如果它与 的值的开头匹配$-,那么整个扩展的结果就是和$-之间的最短匹配模式被删除。*i$-

例子

VAR="baioasd";
echo ${VAR#*i};

输出oasd

在你的情况下

如果 shell 是交互式的,$-将包含字母“i”,因此当您剥离$-模式的变量时,*i您将得到一个与原始字符串不同的字符串$-[[ ${-#*i} != ${-} ]]yelds true)。如果 shell 不是交互式的,$-则不包含字母“i”,因此该模式*i不匹配任何内容$-[[ ${-#*i} != $- ]]输出错误,然后return执行该语句。

于 2013-06-05T08:49:45.893 回答
3

看到这个

要在启动脚本中确定 Bash 是否以交互方式运行,请测试“-”特殊参数的值。当 shell 交互时它包含 i

您的替换将删除字符串,并包含iand 测试替换的版本是否等于原始字符串。如果i${-}.

于 2013-06-05T08:53:05.053 回答