인수를 승인하는 bash 스크립트를 zsh 스크립트로 변환 echo “Creating

쉽게 hub만드는 데 사용하는 bash 스크립트가 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



답변

문제는 zsh의 read기능이 bash와 다른 옵션을 사용 한다는 것입니다. bash에서 read -p프롬프트를 지정합니다. zsh에서는 존재하지 않는 coprocess에서 읽습니다. 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그것이 보내고 없습니다 (bash는 또는 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"


답변