답변:
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
Press a key to continue...
를 사용하면 초보 사용자라도 a
키 를 찾아 누를 수 있습니다. o)
read: 1: read: Illegal option -n
명령을 래핑하십시오 . Lando 래퍼 명령 으로이 작업을 수행하고 있습니다. bash -c 'command && command'
sh
나는이 방법을 매우 짧게 사용하며 @ 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, 올바른 입력의 경우 읽기를 위해 마지막 프로그램의 종료 코드를 알고 있어야합니다. $를 넣어? 모든 명령이 $를 다시 작성하기 때문에 일부 명령 후에 테스트 해야하는 경우 가능한 한 빨리 변수에?
-s
; man read
그리고 read --help
도움은 우분투 10.04.1 LTS에 도움이되지 않았다. 편집 : help read
않았다; 나머지는 더 이상 사용되지 않습니까?
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;
대신 작동합니다. `
-i
우분투에서 완벽하게 -d
작동하며 OSX에서 동일한 방식으로 작동 하는지 모르겠습니다 .
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
status=none
휴대용도 아닙니다. 대신 stdout 및 stderr을 / dev / null로 리디렉션하십시오. read -r line < /dev/tty
한 정도로 것을 위해 Enter 키를 누릅니다 ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
tty 설정을 저장하고 복원합니다.
tr
편집 작업도 가능할까요?
tr
. 파이프로 출력을 버퍼링 하기 때문에 미국 이외의 키보드에는 \1-\177
범위 밖의 문자를 보내는 키가 있습니다. dd
여기서 관용적 방법입니다.
루프 나 스크립트를 일시 중지하고 키 대신 Enter 키를 누르면 기꺼이 read
작업을 수행합니다.
do_stuff
read
do_more_stuff
최종 사용자에게 친숙하지는 않지만 빠른 스크립트를 직접 작성하고 백그라운드에서 수동으로 무언가를 수행하기 위해 일시 중지해야하는 경우에는 충분할 수 있습니다.
이 기능은 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
대법원 에 넣어 !
예 read
- 를 사용 cron
하면 터미널과 터미널 모두에서 가장 유용한 몇 가지 조정이 있습니다.
예:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120은 2 분 후에 읽기 명령문을 시간 종료하므로 차단하지 않습니다 cron
.
터미널에서 rsync
명령을 실행 하는 데 걸린 시간을 확인하는 데 2 분이 걸립니다 .
그런 다음 echo
후속 bash 프롬프트가 다음 줄에 나타납니다.
그렇지 않으면 Enter터미널에서을 누를 때 "계속 ..."바로 다음에 동일한 행에 표시됩니다 .
"Enter any non-NUL character to continue"
. 일부 키는 문자 (예 :Ctrl
...)를 보내지 않으며 일부 키는 문자 (예 :F1
,Home
...)를 두 개 이상 보냅니다 .bash
NUL 문자를 무시합니다.