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

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

我尝试在我的中实现以下行.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 命令语言中,仅由可移植字符集中的下划线、数字和字母以及以下任意字符组成的单词:!%,@

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

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

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

bashand中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

相关内容