在我的.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 auto
到pacmatic
别名轻松解决。但我想以正确的方式来做。)
我试过谷歌搜索并查看联机帮助页,但无济于事。
别名替换仅在从交互式源读取行时执行。所以第二个别名不受第一个影响,因此是文字替换。
也许类似的东西:
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。
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)
归档时间: |
|
查看次数: |
809 次 |
最近记录: |