首页 > 解决方案 > 如何在 ZSH 中的“eval”之后使用“read -p”请求 y/n 输入?

问题描述

我想编写一个 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

标签: linuxshellscriptingzsh

解决方案


好的,这与 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会有所帮助。


推荐阅读