Zsh别名不起作用,但是在终端中粘贴时命令确实起作用

Rei*_*per 0 git bash zsh zshrc

我的.zshrc文件中有一个别名,称为“管家”,如下所示:

alias housekeeping="git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d"
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,由于某种原因,我得到以下输出:

error: The branch '12795-add-ship-info-to-FAQ' is not fully merged.
If you are sure you want to delete it, run 'git branch -D 12795-add-ship-info-to-FAQ'.
error: branch '97167bb3f' not found.
error: branch '[origin/12795-add-ship-info-to-FAQ:' not found.
error: branch 'gone]' not found.
error: branch 'Edits' not found.
error: branch 'to' not found.
error: branch 'text' not found.
Run Code Online (Sandbox Code Playgroud)

看起来好像传递了错误的论点。

但是,当我直接从终端运行完全相同的命令时,确实得到了预期的结果。

我究竟做错了什么?

che*_*ner 5

问题在于,别名的双引号内$1是指外壳程序当前的第一个位置参数。它可能没有设置,所以您的别名相当于

alias housekeeping="... | awk '{print }' | xargs ..."
Run Code Online (Sandbox Code Playgroud)

之后$1扩展为空字符串。结果,的整个输出(grep而不仅仅是分支名称)被馈送到xargs,它将所有空格(不只是换行符)视为分隔两个参数。

您要么需要转义美元符号(awk '{print \$1}')以确保awk获取正确的脚本,或者更好的是,使用函数而不是别名来避免多余的引号层。

housekeeping () {
  git fetch -p && git branch -vv | awk '/: gone]/ {print $1}' | xargs git branch -d
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经用脚本中grep的模式替换了对的调用awk