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.指出的问题消失。谢谢各位,这确实是问题所在。太棒了,非常感谢你们向我解释这一点!太棒了,非常感谢你向我解释!