我在我工作中的一个程序的文档中看到了这个命令:
cp company-sso /usr/local/bin/company-sso ; sudo chmod +x !cp:$
我知道这:
将阻止下一个命令的执行,它只会被评估,但是这是如何工作的$
?我只见过$
在变量名之前使用,例如$USER
or$HOME
但从未单独使用过。另外,如何!cp
运作?不会执行吗cp
?这样做的目的是什么?这整行有意义吗?
答案1
这是历史扩展,由 介绍!
;必须$
在这种背景下进行解释。!cp:$
有两个部分,由 分隔:
。!cp
是事件指示符,表示“查找以”开头的最新命令cp
。$
是一个单词指示符,它的意思是“取所选命令中的最后一个单词(参数)”。
因此,假设(先前运行的命令)历史记录中的最后一个命令也是cp company-sso /usr/local/bin/company-sso
,!cp:$
则替换为/usr/local/bin/company-sso
,并且运行的命令是sudo chmod +x /usr/local/bin/company-sso
。
作为提及经过杰辛普夫,历史扩展在搜索与字符串匹配的先前命令时不考虑当前命令行,因此如果问题中的两个命令都在同一行中输入,则cp
之前的命令;
不是候选命令。这意味着您问题中给出的命令仅作为两行单独的行才真正有用:
cp company-sso /usr/local/bin/company-sso
sudo chmod +x !cp:$
“:
将停止执行下一个命令,它只会被评估”,但仅当:
被用作命令时;它不适用于:
命令行中存在的其他情况。:
因为命令是外壳特殊内置,它总是成功,忽略它的论点;但确实会执行参数中的任何扩展,并且当遵循特殊内置规则时,也会保留变量赋值。 (Bash 默认情况下不应用此规则。)