converte o script bash que aceita argumento para script zsh

0

Eu tenho um script bash que usa hub para criar pull-requests facilmente. No bash funciona bem, eu só 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 ?

Eu tentei colar o código em .zshrc , mas parece que não está funcionando. Eu recebo o seguinte ao executar 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

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
    
por iamdevlinph 04.09.2017 / 12:27

1 resposta

1

O problema é que a função read do zsh usa opções diferentes das do bash. No bash, read -p especifica um prompt; em zsh, diz para ler de um coprocess (que não existe). Você precisa mudar para a sintaxe zsh, que coloca o prompt após a variável ler (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 bash e zsh): primeiro, use nomes de variáveis em minúsculas ou minúsculas; há um grande número de nomes de variáveis all-caps com significado especial para o shell, sistema, etc (e eles não são os mesmos entre bash e zsh), e é fácil reutilizar acidentalmente um deles com o estranho conseqüências.

Segundo, construindo o comando em uma variável e, em seguida, eval ing não é seguro (em bash ou zsh). Ou use uma matriz , ou apenas coloque a mensagem (e apenas a mensagem ) em uma variável e execute o comando diretamente:

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

echo "Creating pull-request against $1 branch with message: $message"
hub pull-request -b "$1" -m "$message"
    
por 05.09.2017 / 20:05

Tags