코드 저장소에서 원격 스크립트를 실행하면 무한 루프가 발생합니다.

코드 저장소에서 원격 스크립트를 실행하면 무한 루프가 발생합니다.

나는 GitHub에서 원격 Bash 스크립트의 원시 버전을 실행하기 위해 종종 다음 패턴을 사용합니다.

wget -O - https://raw.githubusercontent.com/<username>/<project>/<branch>/<path>/<file> | bash

일반적으로 문제 없이 수행할 수 있지만 특정 스크립트에 다음 코드를 추가했기 때문에 무한 루프가 발생했습니다. echo(GitHub에서 터미널에 복사하여 붙여넣고 직접 실행했는데도 자주 발생합니다.) :

while true; do
    read -p "Example question: Do you wish to edit the PHP file now?" yn
    case $yn in
        [Yy]* ) nano PROJECT/PHP_FILE; break;;
        [Nn]* ) break;;
        * ) echo "Please answer yes or no.";;
    esac
done

다음을 통해 문제를 적어도 부분적으로 해결할 수 있었습니다.

cd ACTION_DIRECTORY
wget https://raw.githubusercontent.com/<username>/<project>/<branch>/<path>/<file> &&
source FILENAME &&
rm FILENAME

이는 | bash파이프라인이 적어도 문제를 악화시키고 있음을 시사합니다.언제나뒤에 오세요.

echo "Please answer yes or no.""끝없이" 일어나는가? ( CTRLC+ 로 중지했습니다 C.)
한 줄 및/또는 에서 명령을 실행하는 데 문제가 있었나요 while true; do case esac done?

답변1

echo …"끝없이" 일어나는가?

표준 입력 과 함께 . 는 동일한 표준 입력에서 읽습니다 wget … | bash.wgetbashbashwgetread

일반적으로 read스크립트 소스에서 읽으면 스크립트의 일부가 소모될 수 있습니다. 귀하의 경우에는 bash전체 while … done조각을 읽어야 합니다(예: while … done <whatever). 일할 땐 read읽을 게 없어요. 처음에도 read실패했습니다.

문제의 스크립트는 read실패를 확인하지 않습니다.

또한 read -p프롬프트를 표준 입력으로 인쇄하므로 프롬프트가 표시되지 않습니다.

스크립트가 존재 </dev/tty read …하거나 stdin에서 읽지 while … done </dev/tty않으면 콘솔에서 읽습니다. 이 방법은 작동하지만 이 방법을 사용하려면 스크립트 자체를 변경해야 합니다. 일반적으로 말하면, 다른 방식으로 스크립트를 실행하고 전체 스크립트의 stdin에서 읽어야 하는 경우(이는 .readbashread/dev/tty

그러나 nano(당신이 대답한다면 y) 표준 입력에 대해 불평할 수도 있습니다. 수정 사항이 있으면 표준 입력이 (이미 손상된) 파이프에서 나오므로 해당 수정 </dev/tty read …사항 nano이 생성됩니다 . 수정 사항이 있으면 작동합니다.Too many errors from stdinwgetwhile … done </dev/tty

더 큰 스크립트의 경우 이 방법으로 "수정"할 수 있는 위치가 더 많을 수 있습니다. 올바른 일반적인 해결책은 표준 입력을 전혀 가로채지 않는 것입니다.

일반적인 해결 방법은 다음 중 하나를 실행하는 것입니다.

bash <(wget -O - …)
.    <(wget -O - …)

스크립트를 별도의 셸 bash(시도에서와 같이 wget … | bash …)에서 실행할지 아니면 현재 셸에서( source FILENAME솔루션에서와 같이) 실행할지 여부에 따라 다릅니다.

이제 표준 입력을 독립적으로 리디렉션할 수 있습니다. 예를 들면 다음과 같습니다.

yes | bash <(wget -O - …)

문법 <(some_command …)이라고 합니다프로세스 교체. 효과가있다큰 타격을 입은 상태에서그리고 일부 다른 껍질(순수한 껍질은 아님 sh)바시즘). 다음은 몇 가지 흥미로운 관찰입니다.프로세스 대체 및 파이프("STDIN 유지" 섹션이 답변즉, 이것이 바로 귀하의 문제입니다.)

관련 정보