Bash、CMD、PowerShell、macOS における「任意のキーを押す」によるスクリプト一時停止
Bash、CMD、PowerShell、macOS に対応する任意キーでの一時停止機能。
バッチファイルやシェルスクリプトでは、ダブルクリックしたウィンドウやインストーラーのログが見えるように、短時間の待機が必要な場合があります。Windows CMD には専用の**pauseコマンドがあります。Unix シェルではread**を使用します。
PowerShell はその中間に位置し、明示的なパターンが必要です。
このページでは、移植可能なスニペットと、一般的な落とし穴(パイプ、TTY がない SSH、CI など)を集約しています。

より多くのシェル関連情報は、Bash チートシート と PowerShell チートシート をご覧ください。
より広範なツールワークフローについては、開発者ツール:現代の開発ワークフロー完全ガイド を参照してください。
待機すべきタイミング(とすべきでない場合)
対話型ターミナルを人が監視しており、即座に終了したくない場合(例えば、.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
出力がリダイレクトされている場合、動作は異なることがあります。ファイルにログ出力される必要があるスクリプトの場合、対話的な待機ではなく、**timeout /t N**を使用して時間指定の遅延を考慮してください。
**choiceは、タイムアウト付きの待機や特定のキー(メニュースクリプトなど)が必要な場合に役立ちます。これはpause**とは別のトピックですが、同じバッチワークフローでよく見られます。
PowerShell
PowerShell には、すべてのホストで CMD の**pauseと完全に一致する単一のpause**エイリアスはありません。以下の 2 つの一般的なパターンがあります。
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— 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 ターミナルと同様に Bash で動作します。Apple のデフォルトログインシェルはZshであることが多いですが、対話型 Zsh では、Zsh で明示的に実行されるスクリプトで**read -k 1を使用できます。Linux と macOS 間で最大の移植性を確保するには、Bash を使用するか、スクリプトの先頭に#!/usr/bin/env bash**を記述してください。
POSIX sh (移植的な「Enter キーを押してください」)
POSIX **readはread -n**を必要としません(これは POSIX ではありません)。移植的なパターンは「Enter キーを押して続行」です。
#!/bin/sh
printf 'Press Enter to continue... '
read -r _
これは**dash、ksh、ashベースのシステムで広くサポートされています。Bash 拡張なしで真の単一文字「任意のキー」を実現するのは複雑です。最小限のshで必要とする場合は、Bash をドキュメントするか、stty**ベースのアプローチを注意深く使用してください(ターミナル状態、移植性)。
クロスプラットフォーム分岐
インストーラスクリプトでは、OS に応じて分岐することがあります:
- Windows CMD —
pause - PowerShell —
ReadKeyまたはRead-Host - Unix — **
readおよび[ -t 0 ]**ガード
混合環境では、サーバーや CI がブロックされないように、「対話型のみ」のガードを維持してください。
関連する読み物
- Bash チートシート — 一般的なコマンドリファレンス
- PowerShell チートシート — コマンドレットと日常の使い方
参考リンク
- GNU Bash 手引き — Bash Builtins —
read - Microsoft Learn — Read-Host および高度なホスト用コンソール API