使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
,等等