Linux는 DOS 일시 중지와 동일합니까?


236

사용자가 키를 누를 때까지 실행을 일시 중지하려는 Bash 쉘 스크립트가 있습니다. DOS에서는 "pause"명령으로 쉽게 수행 할 수 있습니다. 스크립트에서 사용할 수있는 Linux 버전이 있습니까?

답변:


329

read 이것을한다 :

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1단일 문자 만 기다리도록 지정합니다. -r당신이 다음 키를 누르 때까지 백 슬래시 같은 것을 누르면, 때문에 그렇지 않으면 필요가 원시 모드로 풋 그것은, 그것은 등록하지 않습니다. 이 -p프롬프트는 공백을 포함하는 경우 인용해야하는 프롬프트를 지정합니다. 이 key키는 어떤 키를 눌렀는지 알고 싶은 경우에만 필요합니다.이 경우 키를 통해 액세스 할 수 있습니다 $key.

Bash를 사용하는 -t경우 키를 누르지 않으면 읽기가 실패를 반환하는 시간 초과를 지정할 수도 있습니다 . 예를 들어 :

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi

5
엄밀히 말하면 "Enter any non-NUL character to continue". 일부 키는 문자 (예 : Ctrl...)를 보내지 않으며 일부 키는 문자 (예 : F1, Home...)를 두 개 이상 보냅니다 . bashNUL 문자를 무시합니다.
Stephane Chazelas 2016 년

2
일반적으로 enter, space 또는 Y와 같은 특정 키를 요청하는 것이 좋습니다. 일부 사용자에게는 "ANY"가 혼동 될 수 있습니다. TAB 키가 있으므로 ANY 키가없고 잠재적으로 위험한 키가 있는지 확인하십시오. ESCAPE, CTRL, CMD, 전원 버튼 등과 같이 오늘날에는 더 이상 관련이 없습니다. 오늘날 콘솔은 일반적으로 "모든 키"를 올바르게 해석하는 고급 컴퓨터 사용자 만 사용하기 때문입니다. 아주 오래된 Apple 2 디자인 매뉴얼에는이 주제에 관한 흥미로운 섹션이 있습니다 ( apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf ).
Gellweiler

3
대신이 메시지 Press a key to continue...를 사용하면 초보 사용자라도 a키 를 찾아 누를 수 있습니다. o)
DJDaveMark

1
command | myscript.sh또는에 문제가 있습니다 myscript.sh | command. 해결책 은 이 답변 을 참조하십시오 .
Tom Hale

누군가 오류가 발생했을 가능성이 있으므로 read: 1: read: Illegal option -n명령을 래핑하십시오 . Lando 래퍼 명령 으로이 작업을 수행하고 있습니다. bash -c 'command && command'sh
Elijah Lynn

155

나는이 방법을 매우 짧게 사용하며 @ theunamedguy 및 @Jim 솔루션과 비슷하지만 시간 초과 및 자동 모드가 있습니다.

나는 특히 마지막 경우를 좋아하고 사용자가 누를 때까지 루프에서 실행되는 많은 스크립트에서 사용합니다 Enter.

명령

  • 솔루션 입력

    read -rsp $'Press enter to continue...\n'
  • 이스케이프 솔루션 (-d $ '\ e'포함)

    read -rsp $'Press escape to continue...\n' -d $'\e'
  • 모든 핵심 솔루션 (-n 1 사용)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
  • 미리 선택된 선택이있는 질문 (-ei $ 'Y'사용)

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
  • 시간 초과 솔루션 (-t 5 사용)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
  • 수면 강화 별칭

    read -rst 0.5; timeout=$?
    # echo $timeout

설명

-r 은 "\"또는 "^"와 같은 조합 된 문자를 허용하지 않는 원시 모드를 지정합니다.

-s는 자동 모드를 지정하며 키보드 출력이 필요하지 않습니다.

-p $ ' prompt ' 는 프롬프트를 지정합니다. 공백과 이스케이프 문자를 허용하려면 $ '와'사이에 있어야합니다. 이스케이프 문자에 도움이되도록 달러 기호가있는 작은 따옴표 사이에 넣어야합니다. 그렇지 않으면 간단한 따옴표를 사용할 수 있습니다.

-d $ ' \ e '는 escappe를 구분 문자로 지정하므로 현재 입력의 최종 문자로 모든 문자를 입력 할 수 있지만 사용자가 입력 할 수있는 문자를주의하여 입력해야합니다.

-n 1 은 단일 문자 만 필요함을 지정합니다.

-e는 readline 모드를 지정합니다.

-i $ ' Y ' 는 readline 모드에서 Y를 초기 텍스트로 지정합니다.

-t 5 는 5 초의 시간 초과를 지정합니다

는 입력을 알아야 할 경우에 사용되며, -n1의 경우 누른 키를 알아야합니다.

$? 타임 아웃의 경우 142, 올바른 입력의 경우 읽기를 위해 마지막 프로그램의 종료 코드를 알고 있어야합니다. $를 넣어? 모든 명령이 $를 다시 작성하기 때문에 일부 명령 후에 테스트 해야하는 경우 가능한 한 빨리 변수에?


1
설명을위한 +1 -s; man read그리고 read --help도움은 우분투 10.04.1 LTS에 도움이되지 않았다. 편집 : help read않았다; 나머지는 더 이상 사용되지 않습니까?
Cees Timmerman

1
위대한 설명을 위해 1+ : 그러나 나는 read: -i: invalid option전직에 도착 했다. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;#osx에서 read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;대신 작동합니다. `
Tino Rüb

OSX에서 어떻게 작동하는지 모르겠지만 테스트를 거쳐 -i우분투에서 완벽하게 -d작동하며 OSX에서 동일한 방식으로 작동 하는지 모르겠습니다 .
y.petremann

읽기 전에 에코를 사용하여 프롬프트를 정말 빠르고
훌륭하게 해결할 수 있습니다.

15

read매개 변수가 없으면 enter를 누를 때만 계속됩니다. pause아무 키나 누르면 DOS 명령이 계속됩니다. read –n1이 동작을 원하면 사용하십시오 .


15

이것은 다른 여러 솔루션 (여기에서 가장 인기있는 솔루션 포함)이 아닌 Linux의 여러 가지 맛에서 나에게 도움이되었습니다. 더 읽기 쉽다고 생각합니다 ...

echo Press enter to continue; read dummy;

의 인수로 변수를 제공해야합니다 read.


이 대답은 내 문제를 해결합니다.이 줄을 복사하여 붙여 넣으면 어떤 이유로 더 많은 줄이 추가되면 DOS 일시 중지와 같이 추가 된 줄이 실행되지 않습니다.
Sérgio

10

read -n1휴대용이 아닙니다. 동일한 작업을 수행하는 휴대용 방법은 다음과 같습니다.

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

을 사용하는 것 외에도 프롬프트를 계속하려면 read프레스 ENTER를 누르십시오 .

sed -n q </dev/tty

2
status=none휴대용도 아닙니다. 대신 stdout 및 stderr을 / dev / null로 리디렉션하십시오. read -r line < /dev/tty한 정도로 것을 위해 Enter 키를 누릅니다 ... .
Stephane Chazelas 2016 년

@ StephaneChezales 감사합니다-나는 그것을 몰랐습니다. 지금 고쳐 다시 감사합니다-수정되었습니다. 그건 그렇고 당신은 가치있는 정보의 끝없는 우물입니다.
mikeserv 2016 년

1
또한 settings=$(stty -g); stty raw; dd ...; stty "$settings"tty 설정을 저장하고 복원합니다.
Stephane Chazelas 2016 년

@StephaneChezales-컴퓨터에 있지 않습니다- tr편집 작업도 가능할까요?
mikeserv 2016 년

1
아니요 tr. 파이프로 출력을 버퍼링 하기 때문에 미국 이외의 키보드에는 \1-\177범위 밖의 문자를 보내는 키가 있습니다. dd여기서 관용적 방법입니다.
Stephane Chazelas 2016 년

2

루프 나 스크립트를 일시 중지하고 키 대신 Enter 키를 누르면 기꺼이 read작업을 수행합니다.

do_stuff
read
do_more_stuff

최종 사용자에게 친숙하지는 않지만 빠른 스크립트를 직접 작성하고 백그라운드에서 수동으로 무언가를 수행하기 위해 일시 ​​중지해야하는 경우에는 충분할 수 있습니다.


이것은 사실이지만 데이터베이스의 경우 예제를 보여주는 것이 가장 도움이됩니다.
SDsolar

감사합니다. 기내에서 조언을 받았습니다. 명령 이름을 쓰는 것만으로는 명확하지 않습니다.
mwfearnley

1

이 시도:

function pause(){
   read -p "$*"
}

1
왜 이것이 다운 다운되었는지 설명해 주시겠습니까? 내용이 부족하거나 나쁜 해결책입니까?
3ocene

4
@ 3ocene 이것은 생성 된 함수의 사용법을 보여주지 않습니다; 게다가 이것은 설명이 부족합니다.
parvus

동의했다. 이 함수가 어떻게 호출되는지 예제를 보여줄 수 있습니까?
SDsolar

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


0

read- 를 사용 cron하면 터미널과 터미널 모두에서 가장 유용한 몇 가지 조정이 있습니다.

예:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-n 120은 2 분 후에 읽기 명령문을 시간 종료하므로 차단하지 않습니다 cron.

터미널에서 rsync명령을 실행 하는 데 걸린 시간을 확인하는 데 2 ​​분이 걸립니다 .

그런 다음 echo후속 bash 프롬프트가 다음 줄에 나타납니다.

그렇지 않으면 Enter터미널에서을 누를 때 "계속 ..."바로 다음에 동일한 행에 표시됩니다 .

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