Я хочу создать псевдоним для этой команды. 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"
Я создал его, но он не работает. Есть ли какая-либо синтаксическая ошибка в этой команде.
Нет, вы не можете использовать этот способ.
С помощью псевдонима вы можете отсортировать команду при ее наборе. Например:
alias ls="ls -lh"
Когда вы ls , система знает, что вы говорите, что хотите выполнить ls -lh .
В вашем случае, если вы хотите, чтобы ssh user@ только имя сервера, лучше объявить что-то вроде этого:
alias myssh="ssh -l user"
Затем, когда вы выполняете myssh server вы действительно используете ssh -l user server .
Нет, вы не можете использовать регулярные выражения в команде псевдонимов.
Чтобы добиться того, чего вы хотите, в Bash вы можете использовать command_not_found_handle . Из справочного руководства:
Если имя не является ни функцией оболочки, ни встроенной функцией и не содержит косых черт, Bash ищет в каждом элементе
$PATHкаталог, содержащий исполняемый файл с этим именем. Bash использует хеш-таблицу для запоминания полных путей к исполняемым файлам, чтобы избежать многократного поиска вPATH(см. Описание хеша в Bourne Shell Builtins). Полный поиск по каталогам в$PATHвыполняется только в том случае, если команда не найдена в хеш-таблице. Если поиск не выполнен, оболочка ищет определенную функцию оболочки с именемcommand_not_found_handle. Если эта функция существует, она вызывается с исходной командой и аргументами исходной команды в качестве аргументов, и состояние выхода функции становится состоянием выхода оболочки. Если эта функция не определена, оболочка печатает сообщение об ошибке и возвращает состояние выхода 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):
# 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