Я хочу создать псевдоним для этой команды. 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