파이프에서 사용자 입력을 읽는 방법은 무엇입니까?


9

confirmation.sh다음 내용 의 파일이 있다고 가정 해 봅시다 .

#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
    n|N) echo "smth"
        ;;
    y|Y) echo "smth"
        ;;
esac

이 스크립트를 다음과 같은 방식으로 실행하고 싶습니다.

cat confirmation.sh | sh

나는 참조 Are you sure [Y/n]?하고 스크립트가 중단됩니다. 뭐가 문제 야?


2
당신은 /bin/bash뱅 라인, 아직 당신은 사용 .sh확장 및 파이프에 스크립트를보십시오 sh. 가지고있는 코드가 두 코드와 호환되므로 문제가되지 않지만 지적 할 가치가 있습니다.
Graeme

답변:


8

기타 상기 한 바와 같이 때문이다 stdinsh정상적으로되는 바와 같이 파이프로부터 판독로 재,이 단자에 접속되지 않는다. 이 문제를 해결하기 위해 할 수있는 한 가지는 /dev/tty터미널에서 스크립트를 읽도록하는 것입니다. 예 :

#!/bin/sh

read -p "Are you sure [Y/n]?" line </dev/tty
case "$line" in
  y|Y) echo "confirmed"
    ;;
  *) echo "not confirmed"
    ;;
esac

일반적으로 사람들이 입력을 스크립팅하지 못하게하려면 다음과 같이하십시오.

echo Y | sh confirmation.sh

사용자가 Y프롬프트에서 자동으로 입력 할 것으로 예상하더라도 터미널에서 여전히 읽습니다 . 암호를 요구하는 프로그램이이를 수행하는 것이 일반적입니다.


2
sh 3<<CONFIRM /dev/fd/3
    $(cat ./confirmation.sh)
CONFIRM

sh 3<./confirmation.sh /dev/fd/3

참고 : 위의 두 가지 예에서 나를 수정 한 @Graeme 덕분에 ...

stdin명확하게 유지하면 훨씬 쉽게 할 수 있습니다 .

2<./confirmation.sh . /dev/stderr

또는 터미널의 0 1 2가 모두 같은 파일이므로 다음을 추가하십시오.

read line <&2

그리고 당신의

cat ./confirmation.sh | sh

잘 작동합니다.


나는 이것들 중 어느 것도 마지막 것과 별개로 작동하도록 할 수 없습니다.
Graeme

이상하게도 그들은 모두 나를 위해 일했습니다 ... 나는 뭔가 중간에 있지만 10 분 정도 후에 다시 테스트 할 수 있습니다. 그동안 ... BOLD 귀하의 의견이 있습니까? 나는 잘못된 정보를 전파하는 것을 좋아하지 않습니다.
mikeserv

@Graeme-처음으로 왜 그리웠는지 모르겠습니다. 동시에 테스트를 모두 맹세했을 수 있습니다. 그러나 처음 두 가지는 올바르게 작동하려면 변경이 필요합니다. 감사합니다.
mikeserv

좋아 stderr보이지만 소스를 읽을 때 여전히 터미널에서 읽지 않습니다 . 나는 아마 이유를 이해하지 못한다.
Graeme

@Graeme-이상하다-나는 대시 sh zsh와 bash로 시도했다. 모두 일했다.
mikeserv

0

이것은 하나의 인수가 내 스크립트로 파이프되어 작동했습니다.

if [ -p /dev/stdin ]; then set -- "$( cat )"; fi

그런 다음 $1다른 스크립트 작업과 호환되는 위치 인수 ( )로 파이프 데이터에 액세스 할 수 있습니다 .


보낸 사람 info test:

[ -p /dev/stdin ]: -p FILEFILE이 있고 명명 된 파이프 인 경우 True입니다.


-1

짧은 대답은 당신이 할 수 없다는 것입니다. 파이프는 stdout을 stdin으로 리디렉션하므로, 첫 번째 명령의 출력을 파이프 명령문의 두 번째 명령에 대한 입력으로 이미 리디렉션 했으므로 대화식 스크립트를 실행할 수 없습니다.

다음과 같은 작업을 수행하려고 할 수 있습니다.

cat confirmation.sh > ask.sh && sh ask.sh

여전히 대화식 스크립트를 실행할 수 있습니다. 내 답변을 참조하십시오. 또한 왜 안되죠 sh confirmation.sh?
Graeme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.