Я бы порекомендовал сделать это, чтобы вместо этого использовать ваш (и системный )файл известных хостов ssh:
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'
Если вы все еще хотите использовать /etc/hosts вместо этого:
strip='[:blank:]#[^[:blank:]]#'
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~strip}}})'
Удачи!
Было бы более эффективно использовать сравнение строк вbash
:
if [[ $PWD != *$old* ]]; then
предполагая, что $old
имеет какое-то значение (оно не установлено в вашей функции, что является вашей проблемой ).
Думаю, частичная реализация вашей функции могла бы выглядеть так
cd () {
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}
(заимствование сообщения об ошибке из zsh
, который имеет ту же функцию cd
, встроенную в)
Однако эта функция не позволяет пользователю передавать какие-либо другие аргументы в cd
. Чтобы обрабатывать параметры, вам нужно будет выполнить полный разбор командной строки.
Игнорирование параметров:
cd () {
if [[ $# -lt 2 ]]; then
builtin cd "$@"
return
fi
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}
Ваша проблема в том, что old
никогда не устанавливается, по крайней мере, не в той части вашего кода, которую вы опубликовали. grep
всегда будет совпадать при поиске нулевой строки ""
и возвращает нулевой код выхода:
$ echo $PWD | grep ""; echo $?
/home/jim
0