Metti in pausa gli script con "Premi un tasto" in Bash, CMD, PowerShell e macOS.

Pausa su qualsiasi tasto per Bash, CMD, PowerShell e macOS.

Indice

I file batch e gli script shell hanno spesso bisogno di una breve pausa affinché una finestra aperta con un doppio clic o un log di installazione rimangano visibili. Windows CMD dispone di un comando dedicato, pause. I shell Unix utilizzano read.

PowerShell si colloca a metà strada e richiede un pattern esplicito.

Questa pagina raccoglie frammenti di codice portabili e gli errori più comuni (pipe, SSH senza TTY, CI).

Finestre del terminale — richieste di pausa su Bash, CMD e PowerShell

Per ulteriori riferimenti sugli shell, consulta la Scheda di riferimento per Bash e la Scheda di riferimento per PowerShell.

Per esplorare flussi di lavoro più ampi relativi agli strumenti, visita Strumenti per Sviluppatori: La Guida Completa ai Flussi di Lavoro di Sviluppo Moderni.

Quando mettere in pausa (e quando non farlo)

Utilizza una pausa quando un utente sta osservando un terminale interattivo e desideri evitare una chiusura immediata, ad esempio dopo che un file .bat viene aperto con un doppio clic o dopo che uno script di manutenzione locale stampa un riepilogo.

Evita le pause in cron, nei servizi systemd, nelle pipeline CI e nella maggior parte dei comandi SSH in un’unica riga. Spesso non è presente una tastiera e stdin potrebbe non essere un terminale, quindi l’attesa di un input potrebbe bloccare l’esecuzione indefinitamente. In Bash e POSIX sh, esegui un test con [ -t 0 ] (o test -t 0) prima di richiedere un input.

Windows CMD

Il comando pause stampa una riga localizzata simile a “Premi un tasto per continuare . . .” e attende un tocco sulla tastiera.

:: salva come pause-demo.bat
@echo off
echo Ciao da CMD
pause

Se l’output viene reindirizzato, il comportamento può variare; per gli script che devono essere eseguiti con il logging su file, considera timeout /t N per un ritardo temporizzato invece di una pausa interattiva.

choice è utile quando desideri un’attesa temporizzata o la gestione di tasti specifici (script di menu). È un argomento separato da pause, ma appare spesso negli stessi flussi di lavoro batch.

PowerShell

PowerShell non dispone di un unico alias pause che corrisponda a CMD in ogni host. Seguono due pattern comuni.

Attendi solo Enter

Semplice e funziona in molti host, inclusi alcuni IDE.

# pause-demo.ps1
Read-Host 'Premi Invio per continuare'

Questo non è “qualsiasi tasto”—conta solo Enter.

Attendi qualsiasi tasto (console Windows)

In Windows PowerShell eseguito in un host console normale, ReadKey attende un tocco fisico:

# pause-any-key.ps1
Write-Host 'Premi qualsiasi tasto per continuare...'
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

Se $Host.UI o RawUI non sono disponibili (alcuni host non interattivi, remoting o ambienti vincolati), questa operazione può fallire. Incapsula tali chiamate in try / catch o rileva [Console]::KeyAvailable / le capacità dell’host quando è necessaria robustezza.

PowerShell 7 su piattaforme non Windows potrebbe non offrire la stessa esperienza di ReadKey; in questi casi, preferisci Read-Host o il read nativo dello shell.

Bash (Linux e macOS)

Stile classico “qualsiasi tasto” con un prompt visibile e senza eco del tasto:

#!/usr/bin/env bash
read -r -n 1 -s -p $'Premi qualsiasi tasto per continuare...\n'
  • -n 1 — leggi un carattere
  • -s — silenzioso (nessun eco)
  • -r — grezzo (backslash non speciale)
  • -p — stringa del prompt

Con una protezione amichevole per l’automazione:

#!/usr/bin/env bash
if [ -t 0 ]; then
  read -r -n 1 -s -p $'Premi qualsiasi tasto per continuare...\n'
fi

Note per macOS

Terminal.app e iTerm2 si comportano come altri terminali Unix per Bash. Il shell di login predefinito di Apple è spesso Zsh; per Zsh interattivo puoi utilizzare read -k 1 negli script eseguiti esplicitamente da Zsh. Per la massima portabilità tra Linux e macOS, rimani con Bash o documenta #!/usr/bin/env bash all’inizio dello script.

POSIX sh (portabile “premi Invio”)

Il comando read POSIX non richiede read -n, che non è POSIX. Il pattern portabile è “premi Invio per continuare”:

#!/bin/sh
printf 'Premi Invio per continuare... '
read -r _

Questo è ampiamente supportato sui sistemi basati su dash, ksh e ash. Il “qualsiasi tasto” a carattere singolo vero e proprio senza estensioni Bash è più complicato; se ti serve su sh minimale, documenta Bash o usa approcci basati su stty con cautela (stato del terminale, portabilità).

Ramificazione cross-platform

Gli script di installazione a volte ramificano in base al sistema operativo:

  • Windows CMDpause
  • PowerShellReadKey o Read-Host
  • Unixread con protezione [ -t 0 ]

In ambienti misti, mantieni la protezione “solo interattivo” affinché i server e la CI non si blocchino mai.

Letture correlate

Iscriviti

Ricevi nuovi articoli su sistemi, infrastruttura e ingegneria AI.