사용자가 스페이스 를 누를 때까지 Bash 스크립트를 중지하려면 어떻게해야합니까?
스크립트에 질문이 있습니다.
계속하려면 스페이스 바를 누르거나 CTRL + C 종료하려면
그러면 스크립트가 중지되고 Space를 누를 때까지 기다려야합니다.
코멘트
- 이 모든 내용은이 SO Q에서 다룹니다. & BTW : 리눅스에 상응하는 것 DOS를 일시 중지 하시겠습니까?
- 참조 : while 루프에서 Enter 키를 누를 때까지 셸 스크립트 일시 중지
- 관련 : unix.stackexchange.com/questions/293940/ …
답변
read
를 사용할 수 있습니다.
read -n1 -s -r -p $"Press space to continue...\n" key if [ "$key" = " " ]; then # Space pressed, do something # echo [$key] is empty when SPACE is pressed # uncomment to trace else # Anything else pressed, do whatever else. # echo [$key] not empty fi
위의 공간을 " "
Enter 키, $"\t"
Tab 키
댓글
답변
방법 이 SO Q에서 논의한 & A는 Windows에서 다음과 같은 경우에 익숙한 pause
동작에 대한 대안으로 가장 적합한 후보입니다. BAT 파일을 수행합니다.
$ read -rsp $"Press any key to continue...\n" -n1 key
예
여기에서 위를 실행 한 다음 아무 키나 누르기 만하면됩니다.이 경우 D 키.
$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $
참조
댓글
-
$
befo 여기에있는 문자열 :-rsp $'Press
? - @ rubo77-아. 이것이 ' 특수 문자로 리터럴 문자열을 수행하는 방법입니다. 다음 형식의 ' : $ ' … '
- @ rubo77-' 다릅니다. 그 '는 큰 따옴표가있는 달러 기호이고, 저는 작은 따옴표가있는 달러를 사용했습니다. 댓글을 삭제 해주세요. ' 잘못되었습니다.
- 아, 이해합니다. 프롬프트 문자열 안에 이스케이프 시퀀스를 넣는 경우. wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
- @ rubo77-예, 표기법이 이스케이프 시퀀스를 포함하도록 허용합니다. 추가
echo -e "..."
줄이 없습니다. 이러한 상황에서는 ' 훨씬 더 간결합니다.
답변
함수를 만들 수 있습니다.
pause(){ read -n1 -rsp $"Press any key to continue or Ctrl+C to exit...\n" }
그런 다음 스크립트의 모든 곳에서 사용할 수 있습니다.
pause
설명
- 셸 스크립팅을 처음 사용하는 경우-함수를 사용하기 전에 스크립트 맨 위에 함수를 배치해야합니다.
Answer
hold=" " printf "Press "SPACE" to continue or "CTRL+C" to exit : " tty_state=$(stty -g) stty -icanon until [ -z "${hold#$in}" ] ; do in=$(dd bs=1 count=1 </dev/tty 2>/dev/null) done stty "$tty_state"
이제 후행 줄 바꿈없이 프롬프트를 인쇄합니다. CTRL+C
를 안정적으로 처리하고, 필요한만큼만 stty
를 호출하고, 제어 tty를 가 찾았습니다. 에코, 제어 문자 등을 명시 적으로 제어하는 방법에 대한 정보는 man stty
를 참조하세요.
또한 다음 작업을 수행 할 수도 있습니다.
printf "Press any key to continue or "CTRL+C" to exit : " (tty_state=$(stty -g) stty -icanon LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1 stty "$tty_state" ) </dev/tty
ENTER
, [
테스트 ]
및 다음과 같은 stty
없음 :
sed -n q </dev/tty
댓글
- 마지막 두 솔루션은 bash뿐만 아니라
/bin/sh
(예 : FreeBSD)에서도 잘 작동하는 것 같습니다. - SO 또는 더 나은가요?
답변
다음은 bash
및 zsh
, 터미널에 대한 I / O 확인 :
# Prompt for a keypress to continue. Customise prompt with $* function pause { >/dev/tty printf "%s" "${*:-Press any key to continue... }" [[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN [[ $BASH_VERSION ]] && </dev/tty read -rsn1 printf "\n" } export_function pause
.{ba,z}shrc
답변
게으른 한 줄 :
echo "Press any key to continue or Ctrl+C to cancel" read && do_something.sh
단점은 사용자가 ctrl + c를 누르면 제어권을 잃는다는 것입니다.이 경우 스크립트는 항상 코드 130으로 종료됩니다.
Answer
빈 문자열에 대한 IFS
설정은 공백을 자르는 읽기의 기본 동작을 억제합니다.
try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do # Set IFS to empty string so that read doesn"t trim # See http://mywiki.wooledge.org/BashFAQ/001#Trimming IFS= read -n1 -r key [[ $key == " " ]] && break done echo echo "Continuing ..." } try_this
2018-05-23 업데이트 : 단어 분할이 적용되지 않는 REPLY 변수를 사용하여 단순화 할 수 있습니다.
try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do read -n1 -r [[ $REPLY == " " ]] && break done echo echo "Continuing ..." } try_this
답변
다음은 “의 간단한 해결책입니다. 계속하려면 스페이스 바를 누르세요. (ENTER 아님)
read -s -d " "
스페이스 바를 누를 때까지 대기합니다. 예, 스페이스 바 만 있습니다. Enter 키를 눌러도 깨지지 않습니다.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
블록은 스페이스 바를 눌러도 항상 실행됩니다.bash
를 사용하지 않기 때문입니다.bash
이외의 다른 셸이있는 경우 대신read _
를 사용하면 작동합니다.''
내부에 공백이 있습니까?pipeline | script.sh
이 답변 은 솔루션입니다.