如何创建具有可执行文件名称的别名

Hey*_*fty 0 bash alias

我试图在我的.bashrc

alias ./my_exec='printf "foo"'
Run Code Online (Sandbox Code Playgroud)

但是,别名不起作用,并出现以下行:

bash: alias: `./my_exec': invalid alias name
Run Code Online (Sandbox Code Playgroud)

我知道zsh终端可以完成这项工作,但我不会为了这件事而切换到它。

有没有办法让这个别名起作用?

mos*_*svy 12

在 bash-4.x 中

$ BASH_ALIASES[./my_exec]='echo yes'
$ ./my_exec
yes
Run Code Online (Sandbox Code Playgroud)

根据 bash联机帮助页,您不能/在别名中使用:

上面列出的字符/$`、 和=任何 shell 元字符或引用字符不能出现在别名中。

通过alias name=val语法定义别名时,bash 将拒绝包含正则表达式定义的任何字符的任何别名:

[ \t\n&();<>|\\"'`$/]
Run Code Online (Sandbox Code Playgroud)

请参阅legal_alias_name()其源代码中的函数。请注意,缺少=上述内容并不是遗漏;不可能在别名中使用它只是语法的产物。

但是您可以在别名中使用其中一些字符,方法是通过BASH_ALIASES数组间接定义它:

$ BASH_ALIASES['/a=$']='echo yes'; /a=$
yes
Run Code Online (Sandbox Code Playgroud)

在 bash-5.0 中修复”,您无法再/在别名中使用。但是,为了安慰,您仍然可以使用=

bash-5.0-18-g36f2c406$ BASH_ALIASES[ef=g]='echo yess'
bash-5.0-18-g36f2c406$ ef=g
yess
bash-5.0-18-g36f2c406$ echo $ef
<nothing>
Run Code Online (Sandbox Code Playgroud)

susv4标准中的别名

3.10 别名

在 shell 命令语言中,一个仅由可移植字符集中的下划线、数字和字母以及以下任何字符组成的单词:!%,@

实现可能允许别名中的其他字符作为扩展名。

所以bashzsh(允许/直接在别名中使用)都在标准范围内。

函数名称中的斜线和其他有趣的字符

bashand 中zsh, a/可以直接用在函数名中:

$ /bin/sh(){ echo no /bin/sh today; }
$ /bin/sh -c ls
no /bin/sh today
Run Code Online (Sandbox Code Playgroud)

这是一个不可移植的扩展;标准 shell 只需要支持包含ascii 字母、数字和下划线的函数名,并且不以 digit 开头

在 中bash,函数名可以由除 之外的任何字符组成$,条件是不只包含数字并且在函数定义语法强加的约束内。您可以查看execute_intern_function()check_identifier()了解所有详细信息。

zshall-digits 约束不适用,并且函数名称也可以在定义中引用/转义:

zsh$ 666() echo "$0"; \$() echo "$0"
zsh$ 666; $
666
$
Run Code Online (Sandbox Code Playgroud)