Остановка скриптов с помощью команды «Нажмите любую клавишу» в Bash, CMD, PowerShell и macOS

Пауза по любой клавише для Bash, CMD, PowerShell и macOS.

Содержимое страницы

Пакетные файлы и скрипты оболочки часто требуют короткой паузы, чтобы окно, запущенное двойным щелчком, или журнал установщика оставались видимыми. В Windows CMD для этого есть специальная команда pause. В оболочках Unix используется команда read.

PowerShell занимает промежуточное положение и требует явного паттерна.

На этой странице собраны переносимые фрагменты кода и описаны типичные подводные камни (пайпы, SSH без TTY, CI).

Окна терминала — запросы паузы в Bash, CMD и PowerShell

Для дополнительных справок по оболочкам см. шпаргалку по 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 нет единого псевдонима pause, который соответствовал бы CMD во всех средах выполнения. Следуют два распространенных паттерна.

Ожидание только 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 / хоста, когда нужна надежность.

PowerShell 7 на платформах, отличных от Windows, может не обеспечивать тот же опыт работы с 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.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 с осторожностью (состояние терминала, переносимость).

Разветвление для кросс-платформенного использования

Скрипты установщиков иногда разветвляются в зависимости от ОС:

  • Windows CMDpause
  • PowerShellReadKey или Read-Host
  • Unixread с защитой [ -t 0 ]

В смешанных средах сохраняйте защиту «только для интерактивного режима», чтобы серверы и CI никогда не блокировались.

Связанные материалы

Полезные ссылки

  • Справочник GNU Bash — Bash Builtinsread
  • Microsoft Learn — Read-Host и консольные API для продвинутых сред

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.