Bash, CMD, PowerShell, macOS 에서 '임의 키 입력'으로 스크립트 일시 정지하기

Bash, CMD, PowerShell 및 macOS 를 위한 Any-key 일시 정지.

Page content

배치 파일과 쉘 스크립트는 종종 더블 클릭한 창이나 설치 프로그램 로그가 가시성을 유지할 수 있도록 짧은 대기 시간이 필요합니다. Windows CMD 에는 전용 pause 명령어가 있습니다. Unix 쉘은 **read**를 사용합니다.

PowerShell 은 중간에 위치하며 명시적인 패턴이 필요합니다.

이 페이지에서는 이식 가능한 스니펫과 일반적인 함정 (파이프, TTY 없는 SSH, CI) 을 수집했습니다.

Terminal windows — pause prompts across Bash, CMD, and PowerShell

더 많은 쉘 참고 자료를 보려면 Bash cheat sheetPowerShell cheatsheet를 참조하세요.

더 넓은 도구 워크플로우에 대해서는 Developer Tools: The Complete Guide to Modern Development Workflows를 방문하세요.

언제 대기해야 하는가 (그리고 언제는 하지 않는가)

.bat 파일을 더블 클릭한 후나 로컬 유지 관리 스크립트가 요약 내용을 출력한 후와 같이, 사람이 인터랙티브 터미널을 보고 있으며 즉시 종료되는 것을 방지하고 싶을 때 대기 (pause) 를 사용하세요.

cron, systemd 서비스, CI 파이프라인, 그리고 대부분의 SSH 원라인 (one-liner) 에서는 대기 기능을 건너뛰세요. 키보드가 연결되어 있지 않은 경우가 많고 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

출력이 리디렉션되면 동작이 달라질 수 있습니다. 파일로 로그를 기록해야 하는 스크립트의 경우, 인터랙티브 대기 대신 타이머 기반 지연을 위해 **timeout /t N**을 고려하세요.

**choice**는 시간 제한이 있는 대기나 특정 키 (메뉴 스크립트) 가 필요할 때 유용합니다. 이는 **pause**와는 별개의 주제이지만, 종종 동일한 배치 워크플로우에서 나타납니다.

PowerShell

PowerShell 은 모든 호스트에서 CMD 와 일치하는 단일 pause 별칭을 가지고 있지 않습니다. 두 가지 일반적인 패턴이 있습니다.

Enter 키만 대기

간단하며 일부 IDE 를 포함한 많은 호스트에서 작동합니다.

# pause-demo.ps1
Read-Host 'Press Enter to continue'

이는 **“어떤 키든”**이 아닙니다. Enter 키만 인식됩니다.

어떤 키든 대기 (Windows 콘솔)

일반 콘솔 호스트에서 실행되는 Windows PowerShell의 경우, **ReadKey**는 물리적 키 입력을 기다립니다:

# 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 / 호스트 기능을 감지하세요.

비 Windows 플랫폼의 PowerShell 7 은 동일한 ReadKey 경험을 제공하지 않을 수 있으므로, 이러한 경우 Read-Host 또는 쉘 네이티브 **read**를 사용하는 것이 좋습니다.

Bash (Linux 와 macOS)

가시적인 프롬프트와 키 입력이 표시되지 않는 고전적인 “어떤 키든” 스타일:

#!/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.appiTerm2는 Bash 에 대해 다른 Unix 터미널과 유사하게 동작합니다. Apple 의 기본 로그인 쉘은 종종 Zsh입니다. Zsh 에서 인터랙티브하게 실행되는 스크립트의 경우 **read -k 1**을 사용할 수 있습니다. Linux 와 macOS 전반에 걸쳐 최대한의 이식성을 위해 Bash 를 사용하거나 스크립트 상단에 **#!/usr/bin/env bash**를 명시적으로 문서화하세요.

POSIX sh (이식 가능한 “Enter 누르기”)

POSIX **read**는 POSIX 가 아닌 **read -n**을 필요로 하지 않습니다. 이식 가능한 패턴은 “Enter 를 눌러 계속하세요"입니다:

#!/bin/sh
printf 'Press Enter to continue... '
read -r _

이는 dash, ksh, ash 기반 시스템에서 널리 지원됩니다. Bash 확장 없이 진정한 단일 문자 “어떤 키든"은 더 복잡합니다. 최소한의 **sh**에서 필요할 경우 Bash 를 문서화하거나 터미널 상태와 이식성을 주의 깊게 고려하여 stty 기반 접근 방식을 사용하세요.

교차 플랫폼 분기

설치 스크립트는 때때로 운영 체제에 따라 분기합니다:

  • Windows CMDpause
  • PowerShellReadKey 또는 Read-Host
  • Unix — **read**와 [ -t 0 ] 보호 장치

혼합 환경에서는 서버와 CI 가 결코 차단되지 않도록 “인터랙티브 전용” 보호 장치를 유지하세요.

관련 자료

유용한 링크

  • GNU Bash 매뉴얼 — Bash Builtinsread
  • Microsoft Learn — Read-Host 및 고급 호스트용 콘솔 API

구독하기

시스템, 인프라, AI 엔지니어링에 관한 새 글을 받아보세요.