我试图在我的.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
(允许/
直接在别名中使用)都在标准范围内。
在bash
and 中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()
了解所有详细信息。
在zsh
all-digits 约束不适用,并且函数名称也可以在定义中引用/转义:
zsh$ 666() echo "$0"; \$() echo "$0"
zsh$ 666; $
666
$
Run Code Online (Sandbox Code Playgroud)