Bash、CMD、PowerShell、macOS における「任意のキーを押す」によるスクリプト一時停止

Bash、CMD、PowerShell、macOS に対応する任意キーでの一時停止機能。

目次

バッチファイルやシェルスクリプトでは、ダブルクリックしたウィンドウやインストーラーのログが見えるように、短時間の待機が必要な場合があります。Windows CMD には専用の**pauseコマンドがあります。Unix シェルではread**を使用します。

PowerShell はその中間に位置し、明示的なパターンが必要です。

このページでは、移植可能なスニペットと、一般的な落とし穴(パイプ、TTY がない SSH、CI など)を集約しています。

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

より多くのシェル関連情報は、Bash チートシートPowerShell チートシート をご覧ください。

より広範なツールワークフローについては、開発者ツール:現代の開発ワークフロー完全ガイド を参照してください。

待機すべきタイミング(とすべきでない場合)

対話型ターミナルを人が監視しており、即座に終了したくない場合(例えば、.bat ファイルをダブルクリックした後や、ローカルメンテナンススクリプトがサマリーを表示した直後など)には、待機を使用します。

cronsystemd サービス、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.appiTerm2は、他の Unix ターミナルと同様に Bash で動作します。Apple のデフォルトログインシェルはZshであることが多いですが、対話型 Zsh では、Zsh で明示的に実行されるスクリプトで**read -k 1を使用できます。Linux と macOS 間で最大の移植性を確保するには、Bash を使用するか、スクリプトの先頭に#!/usr/bin/env bash**を記述してください。

POSIX sh (移植的な「Enter キーを押してください」)

POSIX **readread -n**を必要としません(これは POSIX ではありません)。移植的なパターンは「Enter キーを押して続行」です。

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

これは**dashkshashベースのシステムで広くサポートされています。Bash 拡張なしで真の単一文字「任意のキー」を実現するのは複雑です。最小限のshで必要とする場合は、Bash をドキュメントするか、stty**ベースのアプローチを注意深く使用してください(ターミナル状態、移植性)。

クロスプラットフォーム分岐

インストーラスクリプトでは、OS に応じて分岐することがあります:

  • Windows CMDpause
  • PowerShellReadKeyまたはRead-Host
  • Unix — **readおよび[ -t 0 ]**ガード

混合環境では、サーバーや CI がブロックされないように、「対話型のみ」のガードを維持してください。

関連する読み物

参考リンク

  • GNU Bash 手引き — Bash Builtinsread
  • Microsoft Learn — Read-Host および高度なホスト用コンソール API

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。