Bash Zsh别名不起作用,但命令在粘贴到终端时起作用

Bash Zsh别名不起作用,但命令在粘贴到终端时起作用,bash,git,zsh,zshrc,Bash,Git,Zsh,Zshrc,我的.zshrc文件中有一个别名,名为“内务管理”,如下所示: 运行此命令时,由于某种原因,我得到以下输出: 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. err

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

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

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.
看起来它传递了错误的论点

然而,当我直接从终端运行完全相同的命令时,我确实得到了期望的结果


我做错了什么?

问题是,在别名的双引号中,
$1
指的是shell的当前第一个位置参数。它可能未设置,因此您的别名相当于

alias housekeeping="... | awk '{print }' | xargs ..."
之后,$1
扩展为空字符串。因此,
grep
的整个输出,而不仅仅是分支名称,都被馈送到
xargs
,后者将任何空格(而不仅仅是换行符)视为分隔两个参数

您要么需要转义美元符号(
awk'{print\$1}'
),以确保
awk
获得正确的脚本,要么最好使用函数而不是别名,以避免额外的引号层

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

请注意,我已将对
grep
的调用替换为
awk
脚本中的一个模式。

问题在于,在别名的双引号中,
$1
引用shell的当前第一个位置参数。它可能未设置,因此您的别名相当于

alias housekeeping="... | awk '{print }' | xargs ..."
之后,$1
扩展为空字符串。因此,
grep
的整个输出,而不仅仅是分支名称,都被馈送到
xargs
,后者将任何空格(而不仅仅是换行符)视为分隔两个参数

您要么需要转义美元符号(
awk'{print\$1}'
),以确保
awk
获得正确的脚本,要么最好使用函数而不是别名,以避免额外的引号层

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

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

不确定这是否是您的问题,但您必须将awk命令中的
$1
转义为
\$1
,否则将在声明别名时设置它(很可能是空字符串)因为它整体上是双引号。
xargs
默认情况下会将输入中的每个空格分隔的单词(不一定是整行)视为参数。您应该定义一个函数,而不是别名,这会使Benjamin W.指出的问题消失。谢谢大家,这确实是问题所在。不确定这是否是您的问题,但是您必须在awk命令中将
\$1
转义为
\$1
,否则当您声明别名(很可能是空字符串)时,它将被设置,因为它是双引号整体。
xargs
处理输入中的每个空格分隔的单词,而不一定是整行,默认情况下作为参数。你应该定义一个函数,而不是别名,这会让Benjamin W.指出的问题消失。谢谢各位,这确实是问题所在。太棒了,非常感谢你们向我解释这一点!太棒了,非常感谢你向我解释!