我们可以在别名命令中使用正则表达式吗?

我们可以在别名命令中使用正则表达式吗?

我想为这个命令创建别名。ssh user@ip as

 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"

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

答案1

不,您不能在别名命令中使用正则表达式。

为了实现您想要的功能,在 Bash 中,您可以使用command_not_found_handle。从参考手册

如果名称既不是 shell 函数也不是内置命令,并且不包含斜杠,Bash 会在 的每个元素中搜索$PATH包含该名称的可执行文件的目录。Bash 使用哈希表来记住可执行文件的完整路径名,以避免多次PATH搜索(参见 Bourne Shell Builtins 中对哈希的描述)。$PATH仅当在哈希表中找不到该命令时,才会对 中的目录进行完整搜索。如果搜索不成功,shell 会搜索名为 的已定义 shell 函数command_not_found_handle。如果该函数存在,则使用原始命令和原始命令的参数作为其参数来调用它,并且该函数的退出状态将成为 shell 的退出状态。如果该函数未定义,shell 会打印一条错误消息并返回退出状态 127。

然后你可以做这样的事情:

command_not_found_handle() {
    local i ip ip_ok=0
    if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
        IFS=. read -a ip <<< "$1"
        ip_ok=1
        for i in "${ip[@]}"; do
            [[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
        done
    fi
    if ((ip_ok)); then
        ssh "user@$1"
    else
        ( unset -f command_not_found_handle; "$@" )
    fi
}

现在,如果你处于一个command_not_found_handle已经定义的环境中,例如在 Ubuntu 上,你知道,像这样的酷消息

The program 'whatever' can be found in the following packages:
 * whatever
 * whatever-ever
Try: sudo apt-get install <selected package>

你很可能不想覆盖它。你可以像下面这样(在你的 中.bashrc)对该函数进行 monkey-patch:

# Guard to not monkey-patch twice, in case this file is sourced several times
if ! declare -f kalai_command_not_found_existent &>/dev/null; then
    mapfile -s1 -t kalai_command_not_found_existent_ary < <(declare -f command_not_found_handle 2>/dev/null)
    if ((${#kalai_command_not_found_existent_ary[@]})); then
        eval "$(printf '%s\n' "kalai_command_not_found_existent ()" "${kalai_command_not_found_existent_ary[@]}")"
    else
        kalai_command_not_found_existent() { ( unset -f command_not_found_handle; "$@" ) }
    fi
    command_not_found_handle() {
        local i ip ip_ok=0
        if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
            IFS=. read -a ip <<< "$1"
            ip_ok=1
            for i in "${ip[@]}"; do
                [[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
            done
        fi
        if ((ip_ok)); then
            ssh "user@$1"
        else
            kalai_command_not_found_existent "$@"
        fi
    }
    unset command_not_found_existent_ary
fi

答案2

不可以,你不能用这种方式。

使用别名,您可以在输入命令时对其进行排序。例如:

alias ls="ls -lh"

当 你 输入 时ls, 系统 知道 你 说 的 是 你 想要 做 的 事情ls -lh.

对于您来说,如果您希望ssh user@只输入服务器名称,那么更好的方法是声明如下内容:

alias myssh="ssh -l user"

那么,当你做myssh server你真正做的事情时ssh -l user server

相关内容