2013-12-19 1 views
0

Debian의 경우 다음 코드가 작동하지만 CentOS에서는 오류없이 중단됩니다. 오류가 무엇입니까? 나는 그것을 이해할 수 없다.오류없이 Bash-Shell 스크립트가 중단됩니다.

echo "Test 1" 
    ANSWER="" 
    read -p "Enter y or n " ANSWER; 
    echo "Test 2" 

는 출력은 그렇게에 allways 보이는 : 나는 또한 매개 변수 -p없이 읽기 명령을 시도했지만이 또한 작동하지

Test 1 

:

echo "Test 1" 
    ANSWER="" 
    echo "Enter y or n " 
    read ANSWER; 
    echo "Test 2" 

출력 :

Test 1 
    Enter y or n 

if execu 명령 줄에서 명령이 작동하는지, 어떻게해야하는지. 스크립트에는 다음과 같은 "제목"이 있습니다. #!/bin/bash

누군가 도움이 될 수 있습니까?

+0

'type read'의 출력은 무엇입니까? – anubhava

+0

@anubhava "read는 쉘 내장입니다"- 두 시스템 모두에서 – user2966991

+1

은 쉘로 다시 중단되거나 입력을 기다리고 있습니까? 버퍼링 문제 일 수 있습니다. – Donovan

답변

0

@user2966991 - stdin에서 읽는 스크립트는 stdin을 통해 파일을 읽는 더 큰 while 루프입니다. 이것은 작동하지 않습니다. 표준 입력을 다른 파일 핸들러로 재지 정하십시오.

이 샘플 코드를 고려하십시오. 이것은 while 루프와 read가 모두 stdin에서 읽히기 때문에 작동하지 않습니다.

#!/bin/bash 
cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER 
done 

이제이 다른 코드를 고려하십시오.

#!/bin/bash 
# save stdin to file descriptor 5 
exec 5<&0 

cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER <&5 
done 

# restore stdin and close file descriptor 5 
exec 0<&5 5>&- 

필자는 개인적으로 파이프보다 입력 리디렉션을 선호합니다.

cat file | while read var; do 
... 
done 

은 여기에 스크립트를 게시하거나 당신이 어떤 대답을받지 않습니다하시기 바랍니다

while read var; do 
... 
done < file 

다음에 같이 쓸 수있다.

+0

@ user3088572 굉장! 고마워요! 그러나 귀하의 솔루션에 두 가지 질문이 있습니다. 1. 디스크립터는 C++의 저장소 주소에 대한 포인터와 같은 것입니까? 그리고 제가 맞다면 3에서 9까지의 서술자를 사용할 수 있습니까? 2. 왜 파이프보다 입력 재순환을 선호합니까? 성능이 향상 되었습니까? – user2966991

+0

예 파일에 대한 포인터입니다. 설명자 0은 stdin이고 1은 stdout이고 2는 stderr입니다. 3에서 9까지 사용할 수 있습니다. 입력 리디렉션을 사용하여 과부하가 많이 걸린 서버에 해를 끼칠 수있는 추가 프로세스를 실행하지 않아도됩니다. 건강한 시스템에서는 차이점을 알 수 없습니다. – alvits

+0

@ user3088572 아, 알겠습니다. 이 정보에 대해 대단히 감사합니다! :) – user2966991

0

는이

#!/bin/bash 

echo "Test 1" 
read -p "Enter y/n: " ANSWER 
echo " Test 2: ${ANSWER}" 

당신은 대답의 끝 부분에 가까운 필요하지 않았다보십시오.

+0

작은 스크립트로 작동하지만 큰 스크립트에서는 작동하지 않습니다. 스크립트의 두 번째 행에는 "set -e"라고 쓰여 있습니다. 내가 이것을 주석하면 중단하지는 않을 것이고, 또한 입력으로 메시지를 보여주지 않을 것이다.코드는 다음과 같습니다. ANSWER = "" [[ "$ ANSWER"== ""]] while; do -p "y/n을 입력하십시오."ANSWER fi – user2966991

+0

@ user2966991 - 내가 예상하는 작은 스크립트로 작동하는 경우이 코드 블록 내에 문제가 없습니다. 큰 스크립트에서 입력 버퍼를 채우고 어떻게 든이 블록으로 떨어지는 지 확인 했습니까? – alvits

+0

또한 set -e는 디버깅 목적으로 사용되므로 스크립트가 오류가 발생하면 복구 할 수 있습니다. 스크립트가 "set -e"가 설정된 경우 오류 조건이 발생하여 중단됩니다. – alvits