关于scp的一些问题(它显然不喜欢我的.bashrc
文件中存在bash bind命令),我遵循了互联网上聪明人的建议(我找不到帖子现在)把它放在.bashrc
文件的顶部:
[[ ${-#*i} != ${-} ]] || return
为了确保不执行bash初始化,除非在交互式会话中。
现在,这有效。但是,我无法弄清楚它是如何工作的。你能开导我吗?
根据this answer,$-
是为shell设置的当前选项,我知道${}
是用于扩展变量的所谓“子串”语法。
但是,我不理解${-#*i}
部分。为什么$-#*i
与${-#*i}
不同。
答案 0 :(得分:4)
${parameter#word} ${parameter##word}
这个词被扩展为产生一个模式,就像文件名一样 扩张。如果模式匹配 参数的扩展值的开头,然后是结果 扩展是最短的参数的扩展值 匹配模式('#'情况)或最长匹配模式( '##'案例)已删除。如果参数为“@”或“”,则删除模式 操作依次应用于每个位置参数,并且 扩展是结果列表。如果参数是数组变量 使用'@'或''下标,应用模式删除操作 依次对阵列的每个成员,扩展是 结果清单。
来源:http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
基本上${-#*i}
中发生的事情是*i
被扩展,如果它与$-
的值的开头匹配,那么整个扩展的结果是{{1已删除$-
和*i
之间的最短匹配模式。
示例强>
$-
输出VAR="baioasd";
echo ${VAR#*i};
。
在你的情况下
如果shell是交互式的,oasd
将包含字母“i”,因此当您删除模式$-
的变量$-
时,您将获得一个与原始*i
($-
yelds true)。
如果shell不是交互式的,则[[ ${-#*i} != ${-} ]]
不包含字母“i”,因此模式$-
与*i
和$-
yelds false中的任何内容都不匹配,而[[ ${-#*i} != $- ]]
1}}语句被执行。
答案 1 :(得分:3)
要在启动脚本中确定Bash是否以交互方式运行,请测试' - '特殊参数的值。当shell是交互式时它包含i
您的替换会删除字符串,包括i
并测试替换版本是否等于原始字符串。如果i
中有${-}
,则它们会有所不同。