在 Bash、CMD、PowerShell 和 macOS 中使用 “Press Any Key” 暂停脚本
Source: Dev.to
请提供您希望翻译的具体文本内容,我将为您翻译成简体中文并保持原有的格式、Markdown 语法以及技术术语不变。
概述
在脚本交互式运行时(例如双击 .bat 文件或打印摘要的维护脚本),短暂的暂停通常很有用。它可以让窗口保持打开足够长的时间,以便人类阅读输出。
不要使用暂停 在非交互式环境中,例如 cron、systemd 服务、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.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 终端相同。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 _
这在 dash、ksh、ash 以及其他符合 POSIX 的 shell 上都能工作。实现真正的单字符“任意键”暂停而不使用 Bash 扩展会更复杂(例如使用 stty),通常不建议在最小化的 sh 脚本中使用。
跨平台建议
| 环境 | 推荐的暂停方式 |
|---|---|
| Windows CMD | pause(或 timeout /t N 用于定时延迟) |
| PowerShell | Read-Host 用于回车;$Host.UI.RawUI.ReadKey() 用于任意键(含回退) |
| Bash (Linux/macOS) | read -r -n 1 -s -p ... 并使用 [ -t 0 ] 守护 |
POSIX sh | printf …; read -r _(按回车) |
始终保留 “仅交互式” 守护([ -t 0 ] 或等价方式),以防脚本在自动化环境中阻塞。
有用链接
- GNU Bash 手册 – 内建 –
read - Microsoft Learn –
Read-Host和用于高级主机的控制台 API - Bash 速查表 – 通用命令参考
- PowerShell 速查表 – Cmdlet 与日常用法