bash_概要文件中的别名自行执行

bash_概要文件中的别名自行执行,bash,macos,git-bash,Bash,Macos,Git Bash,我在~/.bash_配置文件中设置了一个别名,如下所示: alias lcmt=“git show$(git log--oneline | awk'{print$1;}'| head-n1)” 但是,每当我打开终端窗口时,我都会看到: 致命:不是git存储库(或任何父目录):.git 我已经能够将它缩小到特定的别名,因为当我注释它时,没有错误消息。为什么它会在OSX上自行评估?我可以阻止它这样做吗?双引号表达式中的$(…)将在创建别名的赋值时执行。您可以通过转义$(…)的$来避免这种情况。您想对

我在~/.bash_配置文件中设置了一个别名,如下所示:

alias lcmt=“git show$(git log--oneline | awk'{print$1;}'| head-n1)”

但是,每当我打开终端窗口时,我都会看到:

致命:不是git存储库(或任何父目录):.git

我已经能够将它缩小到特定的别名,因为当我注释它时,没有错误消息。为什么它会在OSX上自行评估?我可以阻止它这样做吗?

双引号表达式中的
$(…)
将在创建别名的赋值时执行。您可以通过转义
$(…)
$
来避免这种情况。您想对
awk
命令中的
$1
执行相同的操作:

alias lcmt="git show \$(git log --oneline | awk '{print \$1}' | head -n 1)"

Shell函数在很多方面都比别名好,包括没有像别名那样引用奇怪的东西。定义一个shell函数来实现这一点很容易:

lcmd() { git show $(git log --oneline | awk '{print $1;}' | head -n 1); }
不过,我还有两个建议:在
$()
表达式周围加上双引号,并让
awk
注意在第一行之后停止:

lcmd() { git show "$(git log --oneline | awk '{print $1; exit}')"; }

啊,谢谢你!另外一个问题,这个OSX是特定的吗?我可以发誓,我在办公室的Fedora bashrc中输入了非常类似的命令,而没有逃过安瓿。不,这在任何平台上的任何Bash中都是相同的行为。顺便说一句,安培表是
&
,美元是
$
;-)该死,两对二,今晚有人着火了D感谢您的帮助:)通常人们在别名定义周围加上单引号以避免类似的问题。但是在本例中,您还需要在
awk
脚本周围加上单引号,并且引号不会嵌套,因此会变得混乱。我推荐一个函数;看看我的答案。