Pause Scripts with 'Press Any Key' in Bash, CMD, PowerShell, and macOS

Any-key pause for Bash, CMD, PowerShell, and macOS.

Page content

Batch files and shell scripts often need a short wait so a double-clicked window or installer log stays visible. Windows CMD has a dedicated pause command. Unix shells use read.

PowerShell sits in the middle and needs an explicit pattern.

This page collects portable snippets and the usual pitfalls (pipes, SSH without TTY, CI).

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

For more shell references, see the Bash cheat sheet and PowerShell cheatsheet.

For broader tooling workflows, visit Developer Tools: The Complete Guide to Modern Development Workflows.

When to pause (and when not to)

Use a pause when a human is watching an interactive terminal and you want to avoid an instant exit—for example after a .bat file is double-clicked, or after a local maintenance script prints a summary.

Skip pauses in cron, systemd services, CI pipelines, and most SSH one-liners. There is often no keyboard attached and stdin may not be a terminal, so waiting for input can hang forever. In Bash and POSIX sh, test with [ -t 0 ] (or test -t 0) before prompting.

Windows CMD

The pause command prints a localized line such as “Press any key to continue . . .” and waits for a keypress.

:: save as pause-demo.bat
@echo off
echo Hello from CMD
pause

If output is redirected, behavior can differ; for scripts that must run logged to a file, consider timeout /t N for a timed delay instead of an interactive pause.

choice is useful when you want a timed wait or specific keys (menu scripts). It is a separate topic from pause but often appears in the same batch workflows.

PowerShell

PowerShell has no single pause alias that matches CMD in every host. Two common patterns follow.

Wait for Enter only

Simple and works in many hosts including some IDEs.

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

This is not “any key”—only Enter counts.

Wait for any key (Windows console)

In Windows PowerShell running in a normal console host, ReadKey waits for a physical key:

# pause-any-key.ps1
Write-Host 'Press any key to continue...'
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

If $Host.UI or RawUI is not available (some non-interactive hosts, remoting, or constrained environments), this can fail. Wrap such calls in try / catch or detect [Console]::KeyAvailable / host capabilities when you need robustness.

PowerShell 7 on non-Windows platforms may not offer the same ReadKey experience; prefer Read-Host or shell-native read in those cases.

Bash (Linux and macOS)

Classic “any key” style with a visible prompt and no echo of the key:

#!/usr/bin/env bash
read -r -n 1 -s -p $'Press any key to continue...\n'
  • -n 1 — read one character
  • -s — silent (no echo)
  • -r — raw (backslash not special)
  • -p — prompt string

With a friendly guard for automation:

#!/usr/bin/env bash
if [ -t 0 ]; then
  read -r -n 1 -s -p $'Press any key to continue...\n'
fi

macOS notes

Terminal.app and iTerm2 behave like other Unix terminals for Bash. Apple’s default login shell is often Zsh; for interactive Zsh you may use read -k 1 in scripts explicitly run by Zsh. For maximum portability across Linux and macOS, stay with Bash or document #!/usr/bin/env bash at the top of the script.

POSIX sh (portable “press Enter”)

POSIX read does not require read -n, which is not POSIX. The portable pattern is “press Enter to continue”:

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

That is widely supported on dash, ksh, and ash-based systems. True single-character “any key” without Bash extensions is messier; if you need it on minimal sh, document Bash or use stty-based approaches with care (terminal state, portability).

Cross-platform branching

Installer scripts sometimes branch on OS:

  • Windows CMDpause
  • PowerShellReadKey or Read-Host
  • Unixread with [ -t 0 ] guard

In mixed environments, keep the “interactive only” guard so servers and CI never block.

  • GNU Bash manual — Bash Builtinsread
  • Microsoft Learn — Read-Host and console APIs for advanced hosts

Subscribe

Get new posts on AI systems, Infrastructure, and AI engineering.