사용자가 누를 때까지 bash 스크립트를 중지하려면 어떻게합니까 Space?
스크립트에 질문을하고 싶습니다
계속하려면 스페이스를 누르고 종료하려면 CTRL+ C를 누르십시오
그런 다음 스크립트가 중지되고 스페이스를 누를 때까지 기다려야합니다.
답변
당신은 사용할 수 있습니다 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
답변
이 SO Q & A에서 논의 된 방법은 pause
BAT 파일을 수행 할 때 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...
$
참고 문헌
답변
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
답변
이를위한 함수를 만들 수 있습니다.
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
그런 다음 스크립트의 어느 곳에서나 사용할 수 있습니다.
pause
답변
게으른 한 라이너 :
echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh
단점은 사용자가 ctrl + c를 누를 때 제어권이 상실된다는 것입니다. 이 경우 스크립트는 항상 코드 130으로 종료됩니다.
답변
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
답변
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
대법원 에 넣어 !