У меня есть сценарий bash, который использует hub чтобы легко создавать pull-requests . В bash все работает нормально, я просто gpr <base_branch> и выполняю логику в коде.

# git pr
function gpr() {
    # exit if no base branch supplied
    if [[ ! $1 ]]; then
        echo "No base branch supplied. Exiting"
        return
    fi

    if [[ ! $2 ]]; then
        echo "Creating pull-request"
        echo "No pull-request message set."
        read -p "Do you want to use the last commit message as pull-request message. Y or N? " choice
        if [[ $choice =~ ^[Yy]$ ]]; then
            # Use last commit message
            COMMIT=$(git log -1 HEAD --pretty=format:%s)
            echo "Using last commit message: $COMMIT"
            MESSAGE="-m '$COMMIT'"
        else
            # Use own message
            read -p "Enter message: " message
            MESSAGE=-"m '$message'"
        fi
    fi
    COMMAND="hub pull-request -b $1 $MESSAGE"
    echo "Creating pull-request against $1 branch with message: $MESSAGE"
    eval $COMMAND
    echo "Pull-request created successfully"
}

Что в итоге приведет к hub pull-request -b <base_branch> -m <pull-request message or last commit message>

Но как мне конвертировать это в zsh?

Я попытался вставить код в .zshrc но, похоже, он не работает. Я получаю следующее при запуске gpr <base_branch>

gpr develop
Creating pull-request
No pull-request message set.
gpr:read:10: -p: no coprocess
gpr:read:18: -p: no coprocess
Creating pull-request against develop branch with message: -m ''
And vim appears

В Bash процесс идет так

gpr develop
Creating pull-request
No pull-request message set.
Do you want to use the last commit message as pull-request message. Y or N? y
Using last commit message: [UIUX-x] Commit message
Creating pull-request against develop branch with message: -m '[UIUX-x] Commit message'
https://github.com/<author>/<repo>/pull/<num>
Pull-request created successfully

1 ответ1

1

Проблема в том, что функция read zsh принимает другие параметры, чем в bash. В bash read -p указывает подсказку; в zsh он говорит читать из сопроцесса (который не существует). Вам нужно переключиться на синтаксис zsh, который ставит подсказку после считываемой переменной (разделенной знаком вопроса):

read "choice?Do you want to use the last commit message as pull-request message. Y or N? "
...
read -p "message?Enter message: "

Кроме того, я бы сделал две другие рекомендации (как для bash, так и для zsh): во-первых, используйте строчные или смешанные имена переменных; существует большое количество имен переменных всех заглавных букв, имеющих особое значение для оболочки, системы и т. д. (и они не одинаковы для bash и zsh), и можно легко случайно повторно использовать одно из них со странным последствия.

Во- вторых, построение команды в переменной , а затем eval ИНГ это не безопасно (в любом Баш или Zsh). Либо используйте массив, либо просто поместите сообщение (и только сообщение) в переменную и выполните команду напрямую:

if ...
    message=$commit
else ...
    read message
fi

echo "Creating pull-request against $1 branch with message: $message"
hub pull-request -b "$1" -m "$message"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .