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


73

사용자가 누를 때까지 bash 스크립트를 중지하려면 어떻게합니까 Space?

스크립트에 질문을하고 싶습니다

계속하려면 스페이스를 누르고 종료하려면 CTRL+ C를 누르십시오

그런 다음 스크립트가 중지되고 스페이스를 누를 때까지 기다려야합니다.


이 모든 것 이상이이 SO Q & A BTW에서 다뤄집니다 : DOS 일시 중지에 해당하는 Linux는 무엇입니까?
slm


답변:


58

당신은 사용할 수 있습니다 read:

read -n1 -r -p "Press space to continue..." 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

12
터미널에서 누른 문자를 인쇄하지 않으려면 -s를 추가해야합니다. 그리고 끝에 줄 바꿈을 추가하십시오. 그렇지 않으면 출력은 질문과 같은 줄에서 직접 계속됩니다. 가장 좋은 방법은 다음과 같습니다.read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
rubo77

1
이 스크립트는 작동하지 않습니다. Red Hat linux에서 방금 테스트했습니다 else. 스페이스 바를 눌렀을 때에도 블록은 항상 실행됩니다.
robert

3
@robert 사용하지 않기 때문 bash입니다. read _대신 다른 쉘이있는 경우 대신 사용하면 작동합니다 bash.
Niklas Rosencrantz

''내부에 공백 이 있어야합니까 ?
호세 안토니오 듀라 올 모스

이다 ''빈 문자열. 안에 공간이 없습니다. ENTER 또는 TAB을 입력하면 적합합니다
rubo77

44

이 SO Q & A에서 논의 된 방법은 pauseBAT 파일을 수행 할 때 Windows에서 익숙한 동작 에 대한 대안으로 가장 적합 합니다.

$ 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...
$ 

참고 문헌


나는 왜 $문자열 앞에 왜 : -rsp $'Press?
rubo77

2
@ rubo77-아. 특수 문자로 리터럴 문자열을 수행하는 방법입니다. 그것은 형태입니다 : $ '...'
SLM

1
@ rubo77-다릅니다. 그것은 큰 따옴표가있는 달러 기호이며 작은 따옴표가있는 달러를 사용했습니다. 해당 의견을 삭제하십시오. 잘못되었습니다.
slm

1
아 이해합니다 프롬프트 문자열 내에 이스케이프 된 시퀀스를 넣는 경우 참조 wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77

@ rubo77-그렇습니다. 표기법은 이스케이프 시퀀스가 ​​추가 echo -e "..."라인 없이 포함되도록 허용 합니다. 이러한 상황에서는 훨씬 더 콤팩트합니다.
slm

6
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를 stty찾은 상태로 정확하게 복원 합니다. 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

5

이를위한 함수를 만들 수 있습니다.

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

그런 다음 스크립트의 어느 곳에서나 사용할 수 있습니다.

pause

쉘 스크립팅을 처음 사용하는 경우
Richard

3

게으른 한 라이너 :

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

단점은 사용자가 ctrl + c를 누를 때 제어권이 상실된다는 것입니다. 이 경우 스크립트는 항상 코드 130으로 종료됩니다.


2

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

1

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대법원 에 넣어 !

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.