계속하려면 스페이스 바를 누르십시오.

사용자가 스페이스 를 누를 때까지 Bash 스크립트를 중지하려면 어떻게해야합니까?

스크립트에 질문이 있습니다.

계속하려면 스페이스 바를 누르거나 CTRL + C 종료하려면

그러면 스크립트가 중지되고 Space를 누를 때까지 기다려야합니다.

코멘트

답변

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 키

댓글

  • 눌린 문자를 터미널에 인쇄하지 않으려면 -s를 추가해야합니다. 그리고 끝에 줄 바꿈을 추가하십시오. 그렇지 않으면 출력이 질문과 같은 동일한 줄에서 직접 계속됩니다. 가장 좋은 방법은 다음과 같습니다. read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • 이 스크립트는 작동하지 않습니다 '. Red Hat linux에서 테스트했습니다 … else 블록은 스페이스 바를 눌러도 항상 실행됩니다.
  • @robert It '는 ' bash를 사용하지 않기 때문입니다. bash 이외의 다른 셸이있는 경우 대신 read _를 사용하면 작동합니다.
  • '' 내부에 공백이 있습니까?
  • 이것은 STDIN에서 읽으며 pipeline | script.sh 이 답변 은 솔루션입니다.

답변

방법 이 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 또는 더 나은가요?

답변

다음은 bashzsh, 터미널에 대한 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 키를 눌러도 깨지지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다