在 scp 出现一些问题之后(显然,它不喜欢我的文件中存在 bash 绑定命令.bashrc),我遵循了互联网上一个聪明人的建议(我现在找不到那个帖子),该建议放在顶部其.bashrc文件如下:
[[ ${-#*i} != ${-} ]] || return
Run Code Online (Sandbox Code Playgroud)
以确保除非在交互式会话中否则不会执行 bash 初始化。
现在,这有效了。但是,我无法弄清楚它是如何工作的。你能启发我吗?
根据这个答案,这$-是为 shell 设置的当前选项,我知道这${}是用于扩展变量的所谓“子字符串”语法。
但是,我不明白这${-#*i}部分。又为什么$-#*i不一样${-#*i}。
\n\n\nRun Code Online (Sandbox Code Playgroud)\n\n${parameter#word}\n${parameter##word}\n该单词被扩展以产生一个模式,就像文件名扩展一样。如果模式与参数扩展值的开头匹配,则扩展的结果是具有最短匹配模式的参数扩展值(\xe2\x80\x98#\xe2\x80\ x99 大小写)或最长匹配模式(\n \xe2\x80\x98##\xe2\x80\x99 大小写)已删除。如果参数为 \xe2\x80\x98@\xe2\x80\x99 或 \xe2\x80\x98 \xe2\x80\x99,则依次对每个位置参数应用模式删除操作,并进行扩展是结果列表。如果参数是数组变量\n,下标为 \xe2\x80\x98@\xe2\x80\x99 或 \xe2\x80\x98 \xe2\x80\x99 的数组变量,则模式删除操作将应用于\n 的每个成员依次数组,扩展就是结果列表。
\n
来源: http ://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
\n\n所以基本上发生的事情${-#*i}是*i被扩展,如果它与 值的开头匹配$-,那么整个扩展的结果是和$-之间的最短匹配模式*i$-被删除。
例子
\n\nVAR="baioasd";\necho ${VAR#*i};\nRun Code Online (Sandbox Code Playgroud)\n\n输出oasd。
在你的情况下
\n\n如果 shell 是交互式的,$-将包含字母“i”,因此当您剥离$-模式的变量时*i,您将得到一个与原始字符串不同的字符串$-([[ ${-#*i} != ${-} ]]结果为 true)。\n如果 shell 不是交互式的,$-则不包含字母“i”,因此该模式与*iin 中的任何内容都不匹配$-,并且[[ ${-#*i} != $- ]]结果为 false,并且return执行该语句。