这个bash代码如何检测交互式会话?

时间:2013-06-05 08:44:38

标签: bash shell

关于scp的一些问题(它显然不喜欢我的.bashrc文件中存在bash bind命令),我遵循了互联网上聪明人的建议(我找不到帖子现在)把它放在.bashrc文件的顶部:

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

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

现在,这有效。但是,我无法弄清楚它是如何工作的。你能开导我吗?

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

但是,我不理解${-#*i}部分。为什么$-#*i${-#*i}不同。

2 个答案:

答案 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)

See this

  

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

您的替换会删除字符串,包括i并测试替换版本是否等于原始字符串。如果i中有${-},则它们会有所不同。