Odpowiedzi:
read
robi to:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
W -n1
precyzuje, że czeka tylko dla pojedynczego znaku. Przełącza -r
go w tryb raw, co jest konieczne, ponieważ w przeciwnym razie naciśnięcie ukośnika spowoduje, że nie zarejestruje się, dopóki nie naciśniesz następnego klawisza. W -p
Określa polecenia, które muszą być cytowane, jeżeli zawiera spacje. key
Argument jest konieczne tylko wtedy, jeśli chcesz wiedzieć, który klucz one wciśnięty, w którym to przypadku można uzyskać do niego dostęp za pośrednictwem $key
.
Jeśli używasz Bash, możesz także określić limit czasu -t
, co spowoduje, że read zwróci błąd, gdy klawisz nie zostanie naciśnięty. Na przykład:
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...
nawet początkujący użytkownicy będą mogli znaleźć a
klucz i nacisnąć go; o)
command | myscript.sh
lub myscript.sh | command
. Zobacz tę odpowiedź, aby znaleźć rozwiązanie.
read: 1: read: Illegal option -n
polecenie, zapakuj swoje polecenie bash -c 'command && command'
itp., Ponieważ prawdopodobnie wystąpił ten błąd sh
. Robię to w poleceniu otoki Lando.
Używam tych sposobów, które są bardzo krótkie i są one jak rozwiązania @theunamedguy i @Jim, ale oprócz tego mają limit czasu i tryb cichy.
Szczególnie podoba mi się ostatni przypadek i używam go w wielu skryptach, które działają w pętli, dopóki użytkownik nie naciśnie Enter.
Wprowadź rozwiązanie
read -rsp $'Press enter to continue...\n'
Rozwiązanie ucieczki (z -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Dowolne kluczowe rozwiązanie (z -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Pytanie z wybranym wyborem (z -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Limit czasu (z -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Usprawniony alias
read -rst 0.5; timeout=$?
# echo $timeout
-r określa tryb raw, który nie pozwala na łączenie znaków takich jak „\” lub „^”.
-s określa tryb cichy, a ponieważ nie potrzebujemy danych wyjściowych z klawiatury.
-p $ „ podpowiedź ” określa podpowiedź, która musi znajdować się między $ a „, aby pozwolić na spacje i znaki ucieczki. Uważaj, musisz umieścić między pojedynczymi cudzysłowami symbol dolara, aby skorzystać ze znaków, które nie mają znaczenia, w przeciwnym razie możesz użyć prostych cudzysłowów.
-d $ ' \ e ' określa znak ucieczki jako znak separatora, więc jako znak końcowy dla bieżącego wpisu można wstawić dowolny znak, ale należy zachować ostrożność, aby wstawić znak, który użytkownik może wpisać.
-n 1 określa, że potrzebuje tylko jednego znaku.
-e określa tryb readline.
-i $ ' Y ' określa Y jako tekst początkowy w trybie readline.
-t 5 określa limit 5 sekund
klawisz służy na wypadek, gdybyś musiał znać wejście, w przypadku -n1, klawisz, który został naciśnięty.
$? służą do poznania kodu wyjścia ostatniego programu, do odczytu, 142 w przypadku przekroczenia limitu czasu, 0 prawidłowe wprowadzanie. Włożyć $? w zmiennej tak szybko, jak to możliwe, jeśli trzeba ją przetestować po niektórych komendach, ponieważ wszystkie komendy przepisałyby $?
-s
; man read
i read --help
pomoc nie pomogła w Ubuntu 10.04.1 LTS. Edycja: help read
zrobiono; czy reszta jest przestarzała?
read: -i: invalid option
za ex. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
na #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
zamiast tego działa dla mnie. `
-i
działa doskonale na Ubuntu, również nie wiem, czy -d
działa tak samo na OSX.
To działało dla mnie w wielu odmianach Linuksa, gdzie niektóre z tych innych rozwiązań nie (w tym najpopularniejsze tutaj). Myślę, że to też jest bardziej czytelne ...
echo Press enter to continue; read dummy;
Zauważ, że zmienną należy podać jako argument dla read
.
read -n1
nie jest przenośny. Przenośnym sposobem na zrobienie tego samego może być:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Oprócz użycia read
, po prostu naciśnij, ENTER
aby kontynuować monit, możesz:
sed -n q </dev/tty
status=none
też nie jest przenośny. Zamiast tego przekieruj stdout i stderr do / dev / null. read -r line < /dev/tty
byłoby wystarczających dla prasy ENTER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
aby zapisać i przywrócić ustawienia tty.
tr
edytowanie też mogłoby działać?
tr
buforowałby dane wyjściowe jako potok, a klawiatury spoza USA mają klucze wysyłające znaki spoza \1-\177
zakresu. dd
jest tutaj idiomatyczny sposób.
Jeśli po prostu chcesz zatrzymać pętlę lub skrypt i z przyjemnością naciśniesz Enter zamiast dowolnego klawisza, wtedy read
sam to zrobi.
do_stuff
read
do_more_stuff
Nie jest przyjazny dla użytkownika końcowego, ale może wystarczyć w przypadkach, gdy piszesz szybki skrypt dla siebie i musisz go zatrzymać, aby zrobić coś ręcznie w tle.
Spróbuj tego:
function pause(){
read -p "$*"
}
Ta funkcja działa zarówno w trybie, jak bash
i zsh
zapewnia we / wy do terminala:
# 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
Włóż to .{ba,z}shrc
do Wielkiej Sprawiedliwości!
Tak, aby użyć read
- i jest kilka poprawek, które sprawiają, że jest najbardziej przydatny zarówno cron
w terminalu, jak i w nim.
Przykład:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-N 120 powoduje przekroczenie limitu czasu odczytu instrukcji po 2 minutach, więc się nie blokuje cron
.
W terminalu daje 2 minuty, aby zobaczyć, jak długo rsync
trwało wykonanie polecenia.
Potem echo
jest następna, więc kolejny wiersz bash pojawi się w następnym wierszu.
W przeciwnym razie pojawi się w tej samej linii bezpośrednio po „kontynuuj ...” po Enternaciśnięciu w terminalu.
"Enter any non-NUL character to continue"
. Niektóre klawisze nie wysłać dowolny znak (npCtrl
...), a niektóre wysłać więcej niż jedną (jakF1
,Home
...).bash
ignoruje znaki NUL.