it-swarm.it

Qual è l'equivalente Linux alla pausa DOS?

Ho uno script Bash Shell in cui vorrei mettere in pausa l'esecuzione fino a quando l'utente preme un tasto. In DOS, questo è facilmente realizzabile con il comando "pause". C'è un equivalente Linux che posso usare nel mio script?

212
jt.

read esegue questa operazione:

[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$ 

Il -n1 specifica che aspetta solo un singolo carattere. Il -r lo mette in modalità raw, che è necessario perché altrimenti, se si preme qualcosa come backslash, non si registra fino a quando non si preme la chiave successiva. Il -p specifica il prompt, che deve essere quotato se contiene spazi. L'argomento key è necessario solo se vuoi sapere quale tasto sono stati premuti, nel qual caso puoi accedervi tramite $key.

Se si utilizza Bash, è anche possibile specificare un timeout con -t, che consente a read di restituire un errore quando non viene premuto un tasto. Quindi per esempio:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi
306
Jim

Uso molto questi metodi molto brevi e sono come le soluzioni @theunamedguy e @Jim, ma anche con il timeout e la modalità silenziosa.

Mi piace soprattutto l'ultimo caso e lo uso in molti script che girano in loop fino a quando l'utente non preme Enter.

Comandi

  • Inserisci soluzione

    read -rsp $'Press enter to continue...\n'
    
  • Escape solution (con -d $ '\ e')

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • Qualsiasi soluzione chiave (con -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • Domanda con scelta preselezionata (con -ei $ 'Y')

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • Timeout solution (con -t 5)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • Sleep enhanced alias

    read -rst 0.5; timeout=$?
    # echo $timeout
    

Spiegazione

- r specifica la modalità raw, che non consente i caratteri combinati come "\" o "^".

- s specifica la modalità silenziosa e perché non abbiamo bisogno dell'output della tastiera.

- p $ ' Prompt ' specifica il prompt, che deve essere tra $ 'e' per lasciare spazi e caratteri di escape . Fai attenzione, devi mettere tra virgolette singole con simbolo di dollari per avvantaggiare i personaggi sfuggiti, altrimenti puoi usare virgolette semplici.

- d $ '\e ' specifica escappe come delimitatore di caratteri, quindi come carattere finale per la voce corrente, questo è possibile per inserire qualsiasi carattere, ma fai attenzione a mettere un carattere che l'utente può digitare.

- n 1 specifica che necessita solo di un singolo carattere.

- e specifica la modalità readline.

- i $ 'Y' specifica Y come testo iniziale in modalità readline.

- t 5 specifica un timeout di 5 secondi

key serve nel caso in cui sia necessario conoscere l'input, in -n1 caso, il tasto che è stato premuto.

$? serve per conoscere il codice di uscita dell'ultimo programma, per leggere, 142 in caso di timeout, 0 input corretto. Metti $? in una variabile il prima possibile se hai bisogno di testarlo dopo i comandi somes, perché tutti i comandi dovrebbero riscrivere $?

146
y.petremann

Questo ha funzionato per me su più versioni di Linux, dove alcune di queste altre soluzioni no (compresi quelli più popolari qui). Penso che sia più leggibile anche ...

echo Press enter to continue; read dummy;

Si noti che una variabile deve essere fornita come argomento a read.

13
BuvinJ

read senza parametri continuerà solo se si preme enter . Il comando DOS pause continuerà se si preme un tasto qualsiasi. Usa read –n1 se vuoi questo comportamento.

12
xsl

read -n1 non è portabile. Un modo portatile per fare lo stesso potrebbe essere:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

Oltre a usare read, basta premere ENTER per continuare Prompt che potresti fare:

sed -n q </dev/tty
8
mikeserv

Se hai solo bisogno di mettere in pausa un ciclo o uno script, e sei felice di premere Invio invece di qualsiasi tasto, allora read da solo farà il lavoro.

do_stuff
read
do_more_stuff

Non è facile da usare per l'utente finale, ma potrebbe essere sufficiente nei casi in cui stai scrivendo uno script veloce per te stesso e devi metterlo in pausa per fare qualcosa manualmente in background.

2
mwfearnley

Questa funzione funziona sia in bash che in zsh e garantisce l'I/O al terminale:

# Prompt for a keypress to continue. Customise Prompt with $*
function pause {
  >/dev/tty printf '%s' "${*:-Press any key to continue... }"
  [[ $ZSH_VERSION ]] && read -krs  # Use -u0 to read from STDIN
  [[ $BASH_VERSION ]] && </dev/tty read -rsn1
  printf '\n'
}
export_function pause

Mettilo nel tuo .{ba,z}shrc per Great Justice!

1
Tom Hale

Sì ad usare read- e ci sono un paio di modifiche che lo rendono più utile sia in cronche nel terminale.

Esempio:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

Il -n 120 fa scadere l'istruzione di lettura dopo 2 minuti, quindi non blocca cronname__.

Nel terminale fornisce 2 minuti per vedere quanto tempo è stato necessario per eseguire il comando rsyncname__.

Quindi il successivo echoè così il successivo prompt di bash apparirà nella riga successiva.

Altrimenti verrà visualizzato sulla stessa riga direttamente dopo "continua ..." quando Enter è premuto nel terminale.

0
SDsolar