ZSH : bash 함수 "read : 1 : -p : no coprocess"내에서 읽기 명령이 실패 함


29

편집하다:

내에서 작동하는 것 같습니다 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에 있음을 알 수 있도록 도와주었습니다.

1) 실제로 test () 함수를 호출하는 곳이 있습니까? 2) #! /bin/bashshebang 뒤에 공간이 있습니까? 나는 그것들이 허용되지 않는다고 생각 했습니까? 3) '#! / usr / bin / env bash'가 더 좋습니다. 4) 어떤 배쉬 버전? (FreeBSD에서 bash 4.1.10으로 테스트
Hennes

질문에 부적절하게 태그를 달았습니다. 사용하고 zsh있지만 bash 스크립트와 충돌 할 것이라고 생각하지 않았습니다. 다시 작성하여 귀하의 질문에 답변했습니다. 올바른 방향으로 나를 가리켜 주셔서 감사합니다!
Nick Tomlin

프로그램은 어떻게 시작합니까? shebang (#!) 인터프리터`줄은로 파일을 실행하려는 경우에만 필요합니다 ./read.sh. 다른 방법으로 실행하거나 시작 스크립트에 넣을 필요는 없습니다. 그리고`zsh ./read.sh '를 사용하여 zsh에서 실행하려면 #으로 시작하는 줄은 무시됩니다. zsh를 사용할 때 bash를 사용한다는 인상을주기 때문에 혼동됩니다.)
Hennes

@NickTomlin 'y'(ZSH 아래) 뒤에 Enter를 넣지 않아도 작동하는 방법을 알고 있습니까?
syntagma

@ REACHUS 아아, 나는하지 않습니다. 행운을 빕니다!
Nick Tomlin

답변:


49

–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

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


왜 제대로 작동하지 않는지 설명해 주셔서 감사합니다. 앞으로 이와 같은 차이점을 확인하겠습니다.
Nick Tomlin

좋은 설명 감사합니다! 정확히 같은 문제가
있었습니다

8

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

#! / usr / bin / env zsh

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

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

테스트

세 의견 :


도와 주셔서 감사합니다. 왜 이것이 작동하지 않는지에 대한 설명 때문에 @scott에 대한 답변을 주었지만 당신이 나에게 준 스 니펫은 완벽하게 작동합니다.
Nick Tomlin

1
단지 세 가지만 더 : 이것은 아마도 프로그래밍 질문이므로 SO에 대해 가장 많이 요청되었을 것입니다. 2) 모든 쉘이 호환되지는 않습니다 (man zsh는 read -p에 대해 다른 것을 반환하고 man bash는 수행합니다. 3) 또 다른 해결책은 vared -c -p 'prompt question'을 검색하는 것입니다
Hennes

+1 알려 주셔서 감사합니다. 앞으로 프로그래밍 중심의 질문을 SO로 보내겠습니다.
Nick Tomlin

이 함수의 마지막 줄 REPLY=""에서 REPLY 변수를 지우려면 추가해야 합니다. 그렇지 않으면 $ REPLY를 반향하면 터미널을 열거 나 닫거나 다시 설정할 때까지 여전히 설정되어있는 것을 볼 수 있습니다.
jasonleonhard

0

이 버전은 하나 이상의 사건을 가질 수 있도록 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터미널을 열거 나 닫거나 다시 설정할 때까지 계속 설정되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.