使zsh别名与带前缀的命令一起使用

使zsh别名与带前缀的命令一起使用,zsh,variable-expansion,Zsh,Variable Expansion,某些命令以某种方式操纵环境,然后调用另一个命令。例如,xargs通过标准输入获取参数并将其附加到args列表的末尾,然后使用这些参数运行 另外,我可以在zsh配置中定义别名。比如说, alias ll='ls -al' 这意味着我可以在命令行中键入ll,ZSH会将其扩展为ls-al 然而,我不能将两者结合使用。如果我写echo Documents | xargs ll我会得到: ll: command not found 是否有方法指示ZSH在相关命令后展开别名?例如,“如果第一个命令是xa

某些命令以某种方式操纵环境,然后调用另一个命令。例如,
xargs
通过标准输入获取参数并将其附加到args列表的末尾,然后使用这些参数运行

另外,我可以在zsh配置中定义别名。比如说,

alias ll='ls -al'
这意味着我可以在命令行中键入
ll
,ZSH会将其扩展为
ls-al

然而,我不能将两者结合使用。如果我写
echo Documents | xargs ll
我会得到:

ll: command not found

是否有方法指示ZSH在相关命令后展开别名?例如,“如果第一个命令是xargs,请展开后面看到的任何其他命令。”

您可以定义一个全局别名:

alias -g ll='ls -al'
但是,请注意,这将扩展
ll
作为不同单词的任何位置,而不仅仅是根据

将检查shell输入中的每个符合条件的单词,以查看是否为其定义了别名。如果是,如果别名位于命令位置(如果它可能是简单命令的第一个单词),或者如果别名是全局的,则将替换为别名的文本如果替换文本以空格结尾,shell输入中的下一个单词始终符合别名扩展的条件。使用别名内置项定义别名全局别名可以使用内置的-g选项定义

全局别名不好,因为将展开
echo ll
中的全局别名
ll

第一个选项是
别名xargs='xargs'
,多余的空格将导致xargs后面的单词展开

但仍然存在一个问题。例如,
mv
通常被别名为
nocorrect mv
,因此
xargs mv
会抱怨
nocorrect:没有这样的文件或目录

我的解决方案是使用以下代码段将其变成函数

函数别名\u展开器{
本地sudo=“$1”
如果[!-x“$sudo”];则
回显“$sudo not found”返回;
fi
localcmd=(${(s::)别名[$2]});#让cmd是命令和参数的数组
($#cmd))| | cmd=($2)#如果cmd没有别名,请使用单个元素的数组
而($#cmd>0))&&&[$cmd[1]==“nocorrect”| |$cmd[1]==“noglob”];do
shift cmd;#删除起始垃圾
完成
本地参数=(${cmd:1})#别名的原始参数
args+=(${@:3})#别名后的其他参数
$sudo${cmd[1]}$args#展开args数组
}
函数xargs{
本地XARGS=/usr/bin/XARGS
alias_展开器$XARGS$@
}
我自己使用上面的代码来扩展
sudo
watch
parallel
,等等