我的.zshrc
文件中有一个别名,称为“管家”,如下所示:
alias housekeeping="git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d"
运行此命令时,由于某种原因,我得到以下输出:
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.
似乎正在传递错误的参数。
但是,当我直接从终端运行完全相同的命令时,我确实获得了预期的结果。
我在做什么错了?
答案 0 :(得分:4)
问题在于别名内的双引号$1
引用了shell当前的第一个位置参数。可能没有设置,所以您的别名等于
alias housekeeping="... | awk '{print }' | xargs ..."
$1
之后的扩展为空字符串。结果,grep
的整个输出(不只是分支名称)被馈送到xargs
,它把 any 空格(不只是换行符)视为分隔两个参数。
您要么需要转义美元符号(awk '{print \$1}'
)以确保awk
获得正确的脚本,要么更好的是,使用 function 代替别名来避免多余的引号层。
housekeeping () {
git fetch -p && git branch -vv | awk '/: gone]/ {print $1}' | xargs git branch -d
}
请注意,我已经用grep
脚本中的模式替换了对awk
的调用。