grep всегда завершается со статусом выхода 0 в операторе if

Я бы порекомендовал сделать это, чтобы вместо этого использовать ваш (и системный )файл известных хостов 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}}})'

Удачи!

0
23.08.2019, 20:33
2 ответа

Было бы более эффективно использовать сравнение строк в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}"
}
2
28.04.2021, 23:30

Ваша проблема в том, что oldникогда не устанавливается, по крайней мере, не в той части вашего кода, которую вы опубликовали. grepвсегда будет совпадать при поиске нулевой строки ""и возвращает нулевой код выхода:

$ echo $PWD | grep ""; echo $?
/home/jim
0
3
28.04.2021, 23:30

Теги

Похожие вопросы