Bash, CMD, PowerShell 및 macOS에서 “Press Any Key”로 스크립트 일시 정지
Source: Dev.to
스크립트 일시 정지: Bash, CMD, PowerShell, macOS에서 “아무 키나 누르세요” 구현하기
스크립트를 실행한 뒤 사용자가 결과를 확인할 수 있도록 잠시 멈추고 싶을 때가 있습니다.
다양한 셸과 운영체제마다 “아무 키나 누르면 계속” 기능을 구현하는 방법이 조금씩 다릅니다.
아래에서는 Bash (Linux), Windows CMD, PowerShell, 그리고 macOS 터미널에서 사용할 수 있는 간단한 방법들을 정리했습니다.
1️⃣ Bash (Linux)
read -n 1 -s -r -p "Press any key to continue..."
echo # 줄바꿈을 위해 추가
-n 1: 한 글자만 읽음-s: 입력을 화면에 표시하지 않음 (silent)-r: 백슬래시를 이스케이프 문자로 처리하지 않음-p: 프롬프트 메시지를 지정
echo는 프롬프트 뒤에 남아 있는 커서를 다음 줄로 이동시키기 위해 넣었습니다.
2️⃣ CMD (Windows)
pause
pause 명령은 기본적으로 “Press any key to continue …” 라는 메시지를 표시하고 키 입력을 기다립니다.
특정 메시지를 지정하고 싶다면:
echo Press any key to continue...
pause >nul
>nul 은 pause 가 출력하는 기본 메시지를 숨깁니다.
3️⃣ PowerShell (Windows)
Read-Host -Prompt "Press any key to continue..."
Read-Host 는 입력을 받아 반환하지만, 여기서는 반환값을 사용하지 않으므로 단순히 대기용으로 활용합니다.
4️⃣ macOS (Terminal)
macOS에서도 기본 쉘이 Bash 혹은 Zsh이므로 Bash와 동일한 방법을 사용할 수 있습니다.
read -n 1 -s -r -p "Press any key to continue..."
echo
Zsh 를 사용한다면 read -k 1 "?Press any key to continue..." 와 같은 형태도 가능합니다.
📌 팁 & 주의사항
- 스크립트 호환성: 위 예제들은 각각의 셸에 특화되어 있습니다. 하나의 스크립트가 여러 환경에서 동작하도록 하려면 OS와 셸을 감지한 뒤 적절한 코드를 실행하도록 조건문을 넣어야 합니다.
- 출력 포맷:
read나Read-Host로 입력을 받는 경우, 사용자가 입력한 문자가 화면에 표시되지 않게(-s옵션) 하는 것이 일반적입니다. 이는 깔끔한 UI를 유지하는 데 도움이 됩니다. - 대체 방법:
stty를 이용해 터미널 모드를 직접 조작하는 방법도 있지만, 위에 소개한read가 가장 간단하고 이식성이 좋습니다.
🎉 마무리
다양한 플랫폼에서 “아무 키나 누르면 계속” 기능을 구현하는 방법을 살펴보았습니다.
필요에 따라 위 코드를 복사해 스크립트에 삽입하면, 사용자가 결과를 확인하고 다음 단계로 진행하도록 자연스럽게 흐름을 제어할 수 있습니다.
Happy scripting! 🚀
Overview
스크립트를 대화식으로 실행할 때(예: .bat 파일을 더블 클릭하거나 요약을 출력하는 유지보수 스크립트) 짧은 일시 정지가 종종 유용합니다. 이는 사람이 출력을 읽을 수 있을 만큼 창을 충분히 열어 둡니다.
비대화식 환경(예: cron, systemd 서비스, CI 파이프라인, 대부분의 SSH 원‑라인)에서는 일시 정지를 사용하지 마세요—stdin이 터미널이 아닐 수 있어 스크립트가 멈출 수 있습니다. Bash와 POSIX sh에서는 프롬프트를 표시하기 전에 [ -t 0 ](또는 test -t 0) 로 테스트하세요.
Windows CMD
내장 pause 명령은 “Press any key to continue …”와 같은 현지화된 메시지를 출력하고 키 입력을 기다립니다.
:: save as pause-demo.bat
@echo off
echo Hello from CMD
pause
- 출력이 리다이렉트된 경우
pause가 다르게 동작할 수 있습니다. - 로그가 남는 실행에서는 인터랙티브한 일시 정지 대신
timeout /t N을 사용해 지정된 시간 지연을 고려하십시오.
choice는 타이머 대기나 특정 키 입력에 사용할 수 있지만, pause와는 별개의 주제입니다.
PowerShell
PowerShell에는 CMD의 pause와 일치하는 단일 별칭이 없습니다. 일반적인 두 가지 패턴은 다음과 같습니다:
Enter 키 입력 요청 (많은 호스트에서 작동)
# pause-demo.ps1
Read-Host 'Press Enter to continue'
오직 Enter 키만 허용됩니다.
any key 입력 요청 (콘솔 호스트 필요)
# pause-any-key.ps1
Write-Host 'Press any key to continue...'
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
$Host.UI또는RawUI를 사용할 수 없는 경우(예: 비대화형 호스트, 원격 실행, 제한된 환경) 호출이 실패할 수 있습니다.try / catch로 감싸거나[Console]::KeyAvailable/ 호스트 기능을 감지하여 견고하게 처리하세요.- PowerShell 7+을 비 Windows 플랫폼에서 실행할 경우
ReadKey가 동일하게 동작하지 않을 수 있습니다; 이 경우Read-Host또는 해당 플랫폼의 기본read명령을 사용하는 것이 좋습니다.
Bash (Linux/macOS)
시각적인 프롬프트와 에코 없이 동작하는 전통적인 “any key” 일시정지:
#!/usr/bin/env bash
read -r -n 1 -s -p $'Press any key to continue...\n'
-n 1한 문자 읽기-s무음(에코 없음)-r원시 모드(백슬래시를 특수 문자로 처리하지 않음)-p프롬프트 문자열
비대화형 환경을 위한 보호
#!/usr/bin/env bash
if [ -t 0 ]; then
read -r -n 1 -s -p $'Press any key to continue...\n'
fi
macOS 터미널
Terminal.app와 iTerm2는 다른 Unix 터미널과 동일하게 동작합니다. macOS의 기본 로그인 쉘은 종종 zsh이며, zsh에서 명시적으로 실행되는 스크립트의 경우 read -k 1을 사용할 수 있습니다. Linux와 macOS 모두에서 최대한 이식성을 확보하려면 Bash를 사용하거나 스크립트 상단에 #!/usr/bin/env bash를 명시하십시오.
POSIX sh (휴대용 “Enter 키 누르기”)
POSIX read 내장 명령은 비표준인 -n 옵션을 필요로 하지 않습니다. 휴대용 “Enter 키 누르기” 패턴은 어디서든 동작합니다:
#!/bin/sh
printf 'Press Enter to continue... '
read -r _
이 코드는 dash, ksh, ash 및 기타 POSIX‑호환 쉘에서 작동합니다. Bash 확장 없이 진정한 단일 문자 “any key” 일시 정지를 구현하려면 (예: stty 사용) 더 복잡하며, 최소한의 sh 스크립트에서는 일반적으로 권장되지 않습니다.
크로스‑플랫폼 권장 사항
| 환경 | 권장 일시정지 |
|---|---|
| Windows CMD | pause (또는 시간 지연을 위한 timeout /t N) |
| PowerShell | Read-Host (Enter용); $Host.UI.RawUI.ReadKey() (아무 키용, 대체 옵션 포함) |
| Bash (Linux/macOS) | read -r -n 1 -s -p ... 와 [ -t 0 ] 가드 사용 |
POSIX sh | printf …; read -r _ (Enter 키 누르기) |
항상 “인터랙티브 전용” 가드 ([ -t 0 ] 또는 동등한) 를 유지하여 자동화된 환경에서 스크립트가 차단되는 것을 방지하십시오.
유용한 링크
- GNU Bash Manual – Builtins –
read - Microsoft Learn –
Read-Hostand console APIs for advanced hosts - Bash cheat sheet – 일반 명령어 참고
- PowerShell cheatsheet – cmdlet 및 일상 사용