我想为这个命令创建别名。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
。