在 Bash、CMD、PowerShell 和 macOS 中使用 “Press Any Key” 暂停脚本

发布: (2026年4月25日 GMT+8 16:09)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将为您翻译成简体中文并保持原有的格式、Markdown 语法以及技术术语不变。

概述

在脚本交互式运行时(例如双击 .bat 文件或打印摘要的维护脚本),短暂的暂停通常很有用。它可以让窗口保持打开足够长的时间,以便人类阅读输出。

不要使用暂停 在非交互式环境中,例如 cronsystemd 服务、CI 流水线或大多数 SSH 单行命令——标准输入可能不是终端,导致脚本挂起。在 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
  • 如果输出被重定向,pause 可能表现不同。
  • 对于记录日志的运行,考虑使用 timeout /t N 来实现定时延迟,而不是交互式暂停。

choice 可用于定时等待或指定键,但它是一个与 pause 不同的话题。

PowerShell

PowerShell 没有与 CMD 的 pause 完全对应的单一别名。常见的两种实现方式如下:

提示 Enter(在多数宿主中可用)

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

仅接受 Enter 键。

提示 任意键(需要控制台宿主)

# pause-any-key.ps1
Write-Host 'Press any key to continue...'
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
  • 如果 $Host.UIRawUI 不可用(例如非交互式宿主、远程会话、受限环境),此调用可能会失败。可将其包装在 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 终端相同。macOS 的默认登录 shell 通常是 zsh;对于明确由 zsh 运行的脚本,可以使用 read -k 1。为了在 Linux 和 macOS 之间获得最大的可移植性,建议使用 Bash,或在脚本顶部注明 #!/usr/bin/env bash

POSIX sh(可移植的“按回车”)

POSIX 的 read 内建不需要 -n,后者是非标准的。一个可移植的“按回车”模式在所有环境下都可工作:

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

这在 dashkshash 以及其他符合 POSIX 的 shell 上都能工作。实现真正的单字符“任意键”暂停而不使用 Bash 扩展会更复杂(例如使用 stty),通常不建议在最小化的 sh 脚本中使用。

跨平台建议

环境推荐的暂停方式
Windows CMDpause(或 timeout /t N 用于定时延迟)
PowerShellRead-Host 用于回车;$Host.UI.RawUI.ReadKey() 用于任意键(含回退)
Bash (Linux/macOS)read -r -n 1 -s -p ... 并使用 [ -t 0 ] 守护
POSIX shprintf …; read -r _(按回车)

始终保留 “仅交互式” 守护([ -t 0 ] 或等价方式),以防脚本在自动化环境中阻塞。

有用链接

0 浏览
Back to Blog

相关文章

阅读更多 »