如何“堆叠”shell 别名?

str*_*gee 12 zsh alias

在我的.profile(来自my的sh仿真模式中.zshrc)中,我有以下代码段:

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"
Run Code Online (Sandbox Code Playgroud)

但是,第二个别名总是覆盖第一个:

% type pacman
pacman is an alias for pacman --color auto
Run Code Online (Sandbox Code Playgroud)

我怎样才能使第二个别名分配“继承”第一个分配,以便如果/usr/bin/pacmatic存在,别名变为pacmatic --color auto

我不反对使用函数而不是别名,但如果不是每次pacman调用时都执行逻辑,我更喜欢它(我想pacmatic在 shell 启动时检查一次,而不是每次pacman运行时)。我也更喜欢sh-portable 脚本,但如果这是不可能的,您可以使用完整的zsh语法。

(是的,我知道这可以通过附加--color autopacmatic别名轻松解决。但我想以正确的方式来做。)

我试过谷歌搜索并查看联机帮助页,但无济于事。

lor*_*nix 6

别名替换仅在从交互式源读取行时执行。所以第二个别名不受第一个影响,因此是文字替换。

也许类似的东西:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"
Run Code Online (Sandbox Code Playgroud)

这会将 'pacman' 设置为正确的值,PACMAN env 变量不会被导出,因此脚本完成后它会消失,并且使用“双引号”将确保在别名声明时进行变量替换,不是每次调用。

我使用类似的方法:

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"
Run Code Online (Sandbox Code Playgroud)

基本上,设置环境变量 PACMAN,在路径中测试 pacmatic,如果找到,设置 PACMAN,然后定义别名。

嗯,你可以再优化一点……

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"
Run Code Online (Sandbox Code Playgroud)

哒哒!如果 PACMAN 未设置或为空,则设置为 'pacman',否则,设置为 PACMAN 的值,通过 'which' 行设置为 pacmatic。


dev*_*ull 5

shell 的alias行为与 a 非常相似#define,即重新定义 shell 别名将覆盖前一个别名。

我不确定什么是 Right Way TM,但一种方法是使用接受参数的 shell 函数并使用它来创建别名。您的代码片段可以重写为:

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"
Run Code Online (Sandbox Code Playgroud)

 


此外,即使您使用不同的别名并尝试使用一个来定义另一个,它也不会起作用,因为默认情况下在非交互模式下不会扩展别名。您需要通过设置启用它expand_aliases

shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)

引用手册:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).
Run Code Online (Sandbox Code Playgroud)