!cp:$ 有什么作用?

Ano*_*est 14 shell bash shell-script file-copy

我在我工作中的一个程序的文档中看到了这个命令:

cp company-sso /usr/local/bin/company-sso ; sudo chmod +x !cp:$
Run Code Online (Sandbox Code Playgroud)

我知道这:会阻止执行下一个命令,它只会被评估,但这如何工作$?我只见过$在变量名之前使用过,例如$USERor$HOME但从来没有单独使用过。还有,怎么操作!cp?不会执行cp?这样做的目的是什么?这整条线有意义吗?

Ste*_*itt 26

这是历史扩展,由!; 在$必须在这方面进行intepreted。!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

正如jschimpf提到的,在搜索与字符串匹配的先前命令时,历史扩展不考虑当前命令行,因此如果问题中的两个命令都在同一行中输入,则before不是候选者。这意味着您的问题中给出的命令只会作为两个单独的行真正有用:cp;

cp company-sso /usr/local/bin/company-sso
sudo chmod +x !cp:$
Run Code Online (Sandbox Code Playgroud)

:将停止执行下一个命令,它只会被评估”,但仅当:用作命令时;它不适用于:命令行中存在的其他情况。:作为命令是一个特殊shell 内置,它总是成功,忽略它的参数;但是确实会执行参数中的任何扩展,并且当遵循特殊内置函数的规则时,也会保留变量赋值。(默认情况下,Bash 不应用此规则。)

  • 我不认为这是正确的。“以 cp 开头的最新命令”不是分号左侧的命令,而是以 cp 开头的最近的早期命令行。例如`true a`后跟`true b; echo !tr:$` 将打印 a 而不是 b。 (5认同)