Risposte:
read
fa questo:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
I -n1
specifica che attende solo per un singolo carattere. Lo -r
mette in modalità raw, che è necessario perché altrimenti, se si preme qualcosa come barra rovesciata, non si registra fino a quando non si preme il tasto successivo. I -p
specifica la richiesta, che deve essere citato se contiene spazi. L' key
argomento è necessario solo se vuoi sapere quale tasto hanno premuto, nel qual caso puoi accedervi $key
.
Se stai usando Bash, puoi anche specificare un timeout con -t
, che fa sì che read non restituisca 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
Press a key to continue...
anche gli utenti meno esperti potranno trovare il a
tasto e premerlo; o)
command | myscript.sh
o myscript.sh | command
. Vedi questa risposta per una soluzione.
read: 1: read: Illegal option -n
assicurarsi di avvolgere il comando in bash -c 'command && command'
ecc. Poiché è probabile che l'errore sia sh
. Lo sto facendo in un comando wrapper Lando.
Uso questi modi molto brevi, che sono come le soluzioni @theunamedguy e @Jim, ma con timeout e modalità silenziosa in aggiunta.
In particolare, adoro l'ultimo caso e lo uso in molti script eseguiti in un ciclo fino a quando l'utente preme Enter.
Inserisci la soluzione
read -rsp $'Press enter to continue...\n'
Soluzione di escape (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
Soluzione di timeout (con -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Alias avanzato del sonno
read -rst 0.5; timeout=$?
# echo $timeout
-r specifica la modalità raw, che non consente 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 compreso tra $ 'e' per lasciare spazi e caratteri di escape. Fai attenzione, devi mettere tra virgolette singole con il simbolo di dollari per beneficiare dei caratteri di escape, altrimenti puoi usare le virgolette semplici.
-d $ ' \ e ' specifica l'escape come carattere delimitatore, quindi come carattere finale per la voce corrente, è possibile inserire qualsiasi carattere, ma fai attenzione a inserire 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
tasto serve nel caso in cui sia necessario conoscere l'input, nel caso -n1, il tasto che è stato premuto.
$? serve a 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 è necessario testarlo dopo alcuni comandi, perché tutti i comandi riscriverebbero $?
-s
; man read
e l' read --help
aiuto non ha aiutato su Ubuntu 10.04.1 LTS. Modifica: help read
did; il resto è deprecato?
read: -i: invalid option
per l'ex. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
su #osx invece read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
funziona per me. `
-i
funziona perfettamente su Ubuntu, inoltre non so come -d
funziona allo stesso modo su OSX.
Questo ha funzionato per me su molteplici versioni di Linux, dove alcune di queste altre soluzioni non lo hanno fatto (comprese le più popolari qui). Penso che sia anche più leggibile ...
echo Press enter to continue; read dummy;
Si noti che una variabile deve essere fornita come argomento a read
.
read -n1
non è portatile. 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 ad usare read
, basta solo premere ENTER
per continuare a richiedere:
sed -n q </dev/tty
status=none
non è neanche portatile. Reindirizzare invece stdout e stderr su / dev / null. read -r line < /dev/tty
sarebbe abbastanza per premere ENTER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
per salvare e ripristinare le impostazioni tty.
tr
modifica potrebbe funzionare?
tr
bufferizzerebbe il suo output come una pipe, e le tastiere non statunitensi hanno tasti che inviano caratteri al di fuori \1-\177
dell'intervallo. dd
è il modo idiomatico qui.
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
farà da solo il lavoro.
do_stuff
read
do_more_stuff
Non è facile per l'utente finale, ma potrebbe essere sufficiente nei casi in cui stai scrivendo uno script rapido per te stesso e devi metterlo in pausa per fare qualcosa manualmente in background.
Prova questo:
function pause(){
read -p "$*"
}
Questa funzione è disponibile in entrambi bash
e zsh
, e assicura 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 la Grande Giustizia!
Sì all'utilizzo read
- e ci sono un paio di modifiche che lo rendono più utile in entrambi cron
e nel terminale.
Esempio:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-N 120 fa scadere l'istruzione read dopo 2 minuti, quindi non si blocca cron
.
Nel terminale ci vogliono 2 minuti per vedere quanto tempo ha richiesto l' rsync
esecuzione del comando.
Quindi il successivo echo
è così che il successivo prompt bash apparirà sulla riga successiva.
Altrimenti verrà mostrato sulla stessa riga direttamente dopo "continua ..." quando Enterviene premuto nel terminale.
"Enter any non-NUL character to continue"
. Alcuni tasti non inviano alcun carattere (comeCtrl
...) e alcuni ne inviano più di uno (comeF1
,Home
...).bash
ignora i caratteri NUL.