나는 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
.wget
bash
bash
wget
read
일반적으로 read
스크립트 소스에서 읽으면 스크립트의 일부가 소모될 수 있습니다. 귀하의 경우에는 bash
전체 while … done
조각을 읽어야 합니다(예: while … done <whatever
). 일할 땐 read
읽을 게 없어요. 처음에도 read
실패했습니다.
문제의 스크립트는 read
실패를 확인하지 않습니다.
또한 read -p
프롬프트를 표준 입력으로 인쇄하므로 프롬프트가 표시되지 않습니다.
스크립트가 존재 </dev/tty read …
하거나 stdin에서 읽지 while … done </dev/tty
않으면 콘솔에서 읽습니다. 이 방법은 작동하지만 이 방법을 사용하려면 스크립트 자체를 변경해야 합니다. 일반적으로 말하면, 다른 방식으로 스크립트를 실행하고 전체 스크립트의 stdin에서 읽어야 하는 경우(이는 .read
bash
read
/dev/tty
그러나 nano
(당신이 대답한다면 y
) 표준 입력에 대해 불평할 수도 있습니다. 수정 사항이 있으면 표준 입력이 (이미 손상된) 파이프에서 나오므로 해당 수정 </dev/tty read …
사항 nano
이 생성됩니다 . 수정 사항이 있으면 작동합니다.Too many errors from stdin
wget
while … done </dev/tty
더 큰 스크립트의 경우 이 방법으로 "수정"할 수 있는 위치가 더 많을 수 있습니다. 올바른 일반적인 해결책은 표준 입력을 전혀 가로채지 않는 것입니다.
일반적인 해결 방법은 다음 중 하나를 실행하는 것입니다.
bash <(wget -O - …)
. <(wget -O - …)
스크립트를 별도의 셸 bash
(시도에서와 같이 wget … | bash …
)에서 실행할지 아니면 현재 셸에서( source FILENAME
솔루션에서와 같이) 실행할지 여부에 따라 다릅니다.
이제 표준 입력을 독립적으로 리디렉션할 수 있습니다. 예를 들면 다음과 같습니다.
yes | bash <(wget -O - …)
문법 <(some_command …)
이라고 합니다프로세스 교체. 효과가있다큰 타격을 입은 상태에서그리고 일부 다른 껍질(순수한 껍질은 아님 sh
)바시즘). 다음은 몇 가지 흥미로운 관찰입니다.프로세스 대체 및 파이프("STDIN 유지" 섹션이 답변즉, 이것이 바로 귀하의 문제입니다.)