read -n1 -r -p "Press space to continue..." key
if["$key"=''];then# Space pressed, do something# echo [$key] is empty when SPACE is pressed # uncomment to traceelse# Anything else pressed, do whatever else.# echo [$key] not emptyfi
Powinieneś dodać -s, aby nie drukować wciśniętego znaku na terminalu. I dodaj podział linii na końcu, w przeciwnym razie dane wyjściowe będą kontynuowane bezpośrednio w tym samym wierszu, co pytanie. Najlepiej byłoby:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
Metoda omówiona w tym SO Q&A jest prawdopodobnie najlepszym kandydatem na alternatywę dla pausezachowania, do którego przyzwyczajasz się w systemie Windows podczas wykonywania plików BAT.
$ read -rsp $'Press any key to continue...\n'-n1 key
Przykład
Tutaj uruchamiam powyższe, a następnie po prostu naciskam dowolny klawisz, w tym przypadku Dklawisz.
$ read -rsp $'Press any key to continue...\n'-n1 key
Press any key to continue...
$
@ rubo77 - tak, że notacja pozwala na dołączenie sekwencji specjalnych bez dodatkowych echo -e "..."linii. W takich sytuacjach jest znacznie bardziej kompaktowy.
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until[-z "${hold#$in}"];doin=$(dd bs=1 count=1</dev/tty 2>/dev/null)done
stty "$tty_state"
To teraz drukuje wiersz bez spływu nowej linii, uchwyty CTRL+Cniezawodnie wywołuje sttytylko tak często, jak to konieczne, i przywraca tty kontrolnego dokładnie do stanu, w którym sttyznalazł. Poszukaj man sttyinformacji o tym, jak jawnie kontrolować echa, kontrolować znaki i wszystko.
Możesz także to zrobić:
printf "Press any key to continue or 'CTRL+C' to exit : "(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1>/dev/null 2>&1
stty "$tty_state")</dev/tty
Ustawienia IFSpustego ciągu pomijają domyślne zachowanie przycinania białych znaków podczas odczytu.
try_this(){
echo -n "Press SPACE to continue or Ctrl+C to exit ... "while true;do# Set IFS to empty string so that read doesn't trim# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key ==' ']]&&breakdone
echo
echo "Continuing ..."}
try_this
AKTUALIZACJA 23.05.2018: Możemy to uprościć, używając zmiennej REPLY, która nie podlega podziałowi słów:
try_this(){
echo -n "Press SPACE to continue or Ctrl+C to exit ... "while true;do
read -n1 -r
[[ $REPLY ==' ']]&&breakdone
echo
echo "Continuing ..."}
try_this
Oto sposób, który działa w obie bashi zshoraz zapewnia I / O 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 do swojej .{ba,z}shrcWielkiej Sprawiedliwości!
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.