如何在别名中使用正则表达式?

KAL*_*VAN 5 bash alias regular-expression

我想将命令“ssh user@10.32.44.225”的别名创建为 10.32.44.225

alias [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9]="ssh user@$0"
Run Code Online (Sandbox Code Playgroud)

我已经创建了它,但它不起作用。这个命令有没有语法错误?

mik*_*erv 0

这是可行的 - 即使使用alias,尽管我知道的唯一方法会涉及到evalwhich 可能是危险的,具体取决于参数可能包含的内容 - 但不能使用正则表达式。这里真正的问题是标记化- 对于 shell 读入的每个简单命令,首先尝试执行它在命令位置中找到的任何单词作为别名。如果做不到这一点,则作为函数/内置函数;如果两者都失败,则作为ed 可执行文件。这是过程的简化,但非常接近事实。$PATH

问题是你在一个单词中有两个可能的标记-ssh是你想要执行的,并且@$IP是你想要执行它的参数。您可以像其他地方建议的那样,简单地将令牌分成两部分并结合 shell 函数 - 这很容易完成。或者你可以让第一个令牌自行分裂

关于 shell$var名称的一个有趣的事情是它们非常明确地说明了它们可以包含哪些字符。保存一个特殊情况,@不在其中。如果我做:

$var_this_is_appended_to_the_name
Run Code Online (Sandbox Code Playgroud)

shell 会将整个字符串解释为单个变量名称,因为名称中允许使用其中的所有字符$var。但...

$var@this_is_appended_to_the_name
Run Code Online (Sandbox Code Playgroud)

...结果是两个标记(如果不一定是两个单词并且 shell$var独立于@the_rest进行扩展。不幸的是,别名扩展没有这样方便的标记,$因此 shell 总是会尝试扩展...

alias@this_is_appended; alias_this_is_appended
Run Code Online (Sandbox Code Playgroud)

...作为单个令牌。也正是因为 shell 同时扩展了两者$varaliased cmdstring所以后者不能包含在前者中并且仍然可以在没有任何参数的情况下执行eval- 但随后给出的任何参数$var- 甚至${varcontains='$(cmd substitutions)'}会被评估两次- 这可能相当危险。

所以我建议你用一个名为如下的readonly变量做一些事情:$ssh

ssh() { case "$1" in
(@*)  set -- "$USER$@";;
esac; command -p ssh "$@"
}

readonly ssh='ssh '
Run Code Online (Sandbox Code Playgroud)

这样你就可以做...

$ssh@someplace.com; $ssh@000.000.000.000
Run Code Online (Sandbox Code Playgroud)

...或者...

ssh @someplace.com
Run Code Online (Sandbox Code Playgroud)

...等等等等,因为 shell 会将两个标记分成两个单词$ssh和。然而,它不起作用,如果你...@somplace.com

"$ssh@someplace.com"
Run Code Online (Sandbox Code Playgroud)

...因为在这种情况下,虽然你得到两个标记,但结果仍然是单个单词。我readonly在上面使用了确保varname 不会被破坏并重置为更危险的内容,但这对于 shell 中的任何普通用户来说$ssh仍然可以使用该函数来实现。ssh我不知道有什么方法可以用于readonlyshell 函数,但是,如果您担心这一点,那么您可能希望在$PATH具有适当读/写权限的 ed shell 脚本中找到该函数。

话又说回来,如果从配置文件或其他文件中设置,它可以在没有函数的情况下工作:

[mikeserv@localhost ~]$ readonly "ssh=ssh $USER"
[mikeserv@localhost ~]$ $ssh@localhost
mikeserv@localhost's password: 
Run Code Online (Sandbox Code Playgroud)

但这样灵活性较差。