我尝试在我的中实现以下行.bashrc
,
alias ./my_exec='printf "foo"'
但是,别名不起作用,并且出现以下行:
bash: alias: `./my_exec': invalid alias name
我知道zsh
终端可以完成这项工作,但我不会为了这件事而切换到它。
有什么方法可以让这个别名起作用吗?
答案1
在 bash-4.x 中
$ BASH_ALIASES[./my_exec]='echo yes'
$ ./my_exec
yes
根据巴什联机帮助页,您不能/
在别名中使用:
那些角色
/
、$
、`
和=
以及上面列出的任何 shell 元字符或引号字符不得出现在别名中。
通过语法定义别名时alias name=val
,bash 将拒绝任何包含正则表达式定义的任何字符的别名:
[ \t\n&();<>|\\"'`$/]
请参阅legal_alias_name()
其源代码中的函数。请注意,缺少=
上述内容并不是遗漏;无法在别名中使用它只是语法的产物。
但是你能通过数组间接定义别名,在别名中使用其中一些字符BASH_ALIASES
:
$ BASH_ALIASES['/a=$']='echo yes'; /a=$
yes
这是”固定的“ 在 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>
susv4 中的别名标准
3.10 别名
在 shell 命令语言中,仅由可移植字符集中的下划线、数字和字母以及以下任意字符组成的单词:
!
、%
、,
、@
。
实现可能允许别名中的其他字符作为扩展名。
因此bash
和zsh
(允许/
直接在别名中使用)都在标准范围内。
函数名称中的斜杠和其他有趣的字符
在bash
and中zsh
,a/
可以直接用在函数名中:
$ /bin/sh(){ echo no /bin/sh today; }
$ /bin/sh -c ls
no /bin/sh today
这是一个非便携式扩展;一个标准的外壳只需要支持函数名其中包含ascii 字母、数字和下划线,并且不以数字开头。
在 中bash
,函数名称可以由除 之外的任何字符组成$
,条件是不只包含数字并且在函数定义语法施加的约束内。你可以看看execute_intern_function()
和check_identifier()
了解所有详细信息。
在zsh
全数字约束不适用的情况下,函数名称也可以在定义中被引用/转义:
zsh$ 666() echo "$0"; \$() echo "$0"
zsh$ 666; $
666
$
答案2
也许你需要一个函数
my_exec(){
print "foo"
}
这为我找到了,
countryip(){
COUNTY="$(whois $1 | grep ountry))"
echo "$COUNTRY $1 \n"
}
$ countryip 192.168.0.1