converter script bash que aceita argumento em script zsh

0

Eu tenho um script bash que usa hubpara criar pull-requestsfacilmente. No bash funciona bem, eu apenas digito gpr <base_branch>e faz a lógica no código.

# 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"
}

Que no final resultará em hub pull-request -b <base_branch> -m <pull-request message or last commit message>

Mas como faço para converter isso em zsh?

Tentei colar o código para, .zshrcmas parece não estar funcionando. Recebo o seguinte ao executargpr <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

No bash, o processo é assim

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
iamdevlinph
fonte
Em vez de uma função shell, que tal um script ~/bin/ou qualquer outra coisa (apenas ajuste sua PATHdireita) com um shebang apontando para bash?
Kamil Maciorowski
Não sei bem como conseguir isso. Também estou fazendo isso, wslpara que seja mais fácil adicionar minha própria função zsh.
Iamdevlinph
De acordo com isso , pode funcionar na WSL. (1) Escreva seu código em um arquivo gprsem linhas: function ...e o último }. (2) Faça a primeira linha de um shebang: #!/bin/bash. (3) Faça o arquivo executável: chmod +x gpr. (4) Mova o arquivo para o ~/bindiretório. (5) Adicione o ~/bincaminho aPATH menos que ele já esteja lá. Em seguida, gprserão tratadas pelo bashmesmo zsh. Esta não é uma resposta; isso pode resolver seu problema, mas não responde à pergunta.
Kamil Maciorowski

Respostas:

2

O problema é que a readfunção do zsh usa opções diferentes das do bash. No bash, read -pespecifica um prompt; no zsh, diz para ler de um coprocesso (que não existe). Você precisa mudar para a sintaxe zsh, que coloca o prompt após a variável ser lida (delimitada por um ponto de interrogação):

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

Além disso, eu faria duas outras recomendações (para o bash e o zsh): primeiro, use nomes de variáveis ​​em letras minúsculas ou em letras maiúsculas; existe um grande número de nomes de variáveis ​​all-caps com significado especial para o shell, sistema, etc. (e não são os mesmos entre o bash e o zsh), e é muito fácil reutilizar acidentalmente um deles com nomes estranhos consequências.

Em segundo lugar, a construção do comando em uma variável e, em seguida, evaling é não segura (em qualquer festa ou zsh). Ou utilizar uma matriz , ou simplesmente colocar a mensagem (e apenas a mensagem) numa variável e executar o comando directamente:

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

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