ZSH : bash 함수 “read : 1 : -p : no coprocess”내에서 읽기 명령이 실패 함 1 -r if [[ $REPLY

편집하다:

내에서 작동하는 것 같습니다 bash. 문제가와 관련이있는 것 같습니다 zsh. 이 문제를 게시하기에 더 좋은 사이트가 있으면 알려주세요.


일련의 디렉토리를 만드는 간단한 스크립트를 작성 중입니다. 사용자가 확인하기 전에 확인을 원합니다. 다음을 기본으로 사용하고 있지만 bash 함수 내에서 실행할 수없는 것 같습니다. 함수 외부에 넣으면 정상적으로 작동합니다. 다음은 격리 된 예입니다.

read.sh

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

SO 게시물의 코드 .

파일을 소싱하거나 test다음과 같은 오류가 발생 read:1: -p: no coprocess합니다. 내가 그것을 배치 할 때 동일한 출력.bashrc

편집 : :

hen

  1. 함수가 구성 파일에 있기를 원하므로 모든 디렉토리 (이상적으로는 .bashrc 또는 .zshrc)에서 호출 할 수 있습니다
  2. 첫 번째 주석 행의 형식을 수정했습니다. 문제가 여전히 존재합니다zsh
  3. Bash 버전은 3.2이지만 문제가 bash가 아닌 zsh에 있음을 알 수 있도록 도와주었습니다.


답변

–p옵션은 동일한 것을 의미하지 않는다 bashread명령에 내장 zshread내장 명령한다. 에서 zshread명령, –p수단 – 추측은 – “입력은 coprocess에서 읽습니다.”나는 당신과 당신의 프롬프트를 표시하는 것이 좋습니다 echo또는 printf.

또한 교체해야 –n 1–k–k 1.


zsh의 상당 bashread -p promptIS

read "?Here be dragons. Continue?"

?첫 번째 인수에서 a 다음 에 나오는 것은 프롬프트 문자열로 사용됩니다.

물론 읽을 변수 이름을 지정할 수 있습니다 (더 나은 스타일 일 수 있음).

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi

쉘 변수를 인용하는 것도 일반적으로 좋은 생각입니다.


답변

이 코드는 zsh에서 원하는 것을하는 것 같습니다.
(당신이 언급 한 질문은 bash에 대한 것입니다).

#! / usr / bin / env zsh

테스트()
{
  echo -n "여기는 용입니다. 계속 하시겠습니까?"
  답장 읽기

  [[$ REPLY = ~ ^ [Yy] $]] 인 경우
  그때
    echo "당신은 그것을 요구했습니다 ..."
  fi
}

테스트

세 의견 :


답변

이 버전은 하나 이상의 사건을 가질 수 있도록 y하거나 Y, n또는N

  1. 선택 사항 : 승인 질문이 제공 될 때까지 질문을 반복하십시오.

  2. 선택적으로 : 다른 답변은 무시

  3. 선택적으로 : 원하는 경우 터미널을 종료하십시오.

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) echo 'nope n' ;;
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }

이것도 주목하십시오 :이 함수의 마지막 줄에서 REPLY 변수를 지우십시오. 그렇지 않으면 echo $REPLY터미널을 열거 나 닫거나 다시 설정할 때까지 계속 설정되어 있습니다.


답변