Как запросить ввод y / n с «read -p» после «eval» в ZSH? - PullRequest
1 голос
/ 05 апреля 2020

Я хочу написать ZSH функцию, которая предлагает мне использовать yadm push после ошибочного git push. Я установил alias git="correct git" и следующую функцию:

function correct (){
    if [ "$1" = "git" ] && [ "$2" = "push" ]; then
        eval "command $1 $2" ||
        echo "Try yadm?"
        select yn in "Yes" "No"; do
            case $yn in
                Yes ) yadm $2; break;;
                No ) break;;
            esac
        done
    fi
}

Вышеуказанное работает, как и ожидалось, хотя я не могу сделать то же самое с read -p:

function correct (){
    if [ "$1" = "git" ] && [ "$2" = "push" ]; then
        eval "command $1 $2" || 
        while true; do
            read -p "Try yadm? (y/n)" yn
            case $yn in
                [Yy]* ) yadm $2; break;;
                [Nn]* ) break;;
                * ) echo "Please answer yes or no.";;
            esac
        done
    fi
}

Как использовать один read -p после eval заявления?

1 Ответ

0 голосов
/ 06 апреля 2020

Хорошо, это вообще не связано с использованием eval. В ZSH, read -p хочет читать из сопроцесса вместо указания приглашения. Ответ здесь .

function correct (){
    if [ "$1" = "git" ] && [ "$2" = "push" ]; then
        command $1 $2 ||
        while true; do
            printf "Try yadm? (y/n)"
            read yn
            case $yn in
                [Yy]* ) yadm $2; break;;
                [Nn]* ) break;;
                * ) echo "Please answer yes or no.";;
            esac
        done
    fi
}

Вторая строка в обеих версиях должна быть command $1 $2 ||, чтобы избежать использования eval, даже если она должна быть вменяемой в операторе if.

Консультации man zshbuiltins были бы полезны.

...