从现有别名创建别名

从现有别名创建别名

我有 2 个单独的文件,它们都源自 my .zshrc,其中一个(第一个)正在定义此别名:

alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"'

问题是,在这个之后的另一个也定义了wget别名:

alias wget='wget -c'

我需要以某种方式确保第二个别名使用前一个别名定义自己。我正在考虑使用类似的东西$(wget),但这只会让我陷入递归循环。是否有一些好方法可以在定义新别名时引用具有相同名称的现有别名?

我可能正在考虑以某种方式获取第一个别名的内容,然后仅将其与我的新标志连接起来,以便它将构建在前一个别名的基础上,如果命令之前还没有别名。

注意:我知道我可以更改其中一个别名的名称并在下一个别名中引用它,但这不是我所要求的。我也不想只是简单地将它们手动定义为 1 个别名。我想要一种在定义新别名时自动使用旧别名定义的方法,以便将它们链接在一起。

知道我该如何实现这样的事情吗?或者也许有更好的方法来做这样的事情?

答案1

您可以使用aliases哈希表为了这:

% zmodload -F zsh/parameter p:aliases
% alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"'
% alias wget="$aliases[wget] -c"
% alias
wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" -c'

如果该命令之前尚未使用别名,我可能还需要进行一些处理才能回退到真正的命令

这可以通过使用来实现${aliases[wget]:-wget}。然后,如果为空,则将使用$aliases[wget]文字值。wget

答案2

可以通过对alias输出进行一些丑陋的解析来完成:

$ alias foo='foo --first'
$ alias foo=$(alias foo | cut --delimiter== --fields=2 | head --bytes=-2 | tail --bytes=+2)' --second'
$ alias foo
alias foo='foo --first --second'

当然,如果alias以任何其他格式(多行或不同的引号)打印别名,那么所有的赌注都会被取消。它也不处理尚未设置别名的情况:

$ unalias foo
$ alias foo=$(alias foo | cut --delimiter== --fields=2 | head --bytes=-2 | tail --bytes=+2)' --second'
bash: alias: foo: not found
$ alias foo
alias foo=' --second'

相关内容