我试图在我的.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_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)
3.10 别名
在 shell 命令语言中,一个仅由可移植字符集中的下划线、数字和字母以及以下任何字符组成的单词:
!、%、,、@。
实现可能允许别名中的其他字符作为扩展名。
所以bash和zsh(允许/直接在别名中使用)都在标准范围内。
在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)