Odpowiedzi:
read robi to:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
W -n1precyzuje, że czeka tylko dla pojedynczego znaku. Przełącza -rgo 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 -pOkreśla polecenia, które muszą być cytowane, jeżeli zawiera spacje. keyArgument 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źć aklucz i nacisnąć go; o)
command | myscript.shlub myscript.sh | command. Zobacz tę odpowiedź, aby znaleźć rozwiązanie.
read: 1: read: Illegal option -npolecenie, 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 $keyPytanie z wybranym wyborem (z -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $keyLimit 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 readi read --helppomoc nie pomogła w Ubuntu 10.04.1 LTS. Edycja: help readzrobiono; czy reszta jest przestarzała?
read: -i: invalid optionza 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. `
-idziała doskonale na Ubuntu, również nie wiem, czy -ddział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 -n1nie 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, ENTERaby kontynuować monit, możesz:
sed -n q </dev/tty
status=noneteż nie jest przenośny. Zamiast tego przekieruj stdout i stderr do / dev / null. read -r line < /dev/ttybyłoby wystarczających dla prasy ENTER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"aby zapisać i przywrócić ustawienia tty.
tredytowanie też mogłoby działać?
trbuforowałby dane wyjściowe jako potok, a klawiatury spoza USA mają klucze wysyłające znaki spoza \1-\177zakresu. ddjest 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 readsam 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 bashi zshzapewnia 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}shrcdo Wielkiej Sprawiedliwości!
Tak, aby użyć read- i jest kilka poprawek, które sprawiają, że jest najbardziej przydatny zarówno cronw 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 rsynctrwało wykonanie polecenia.
Potem echojest 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...).bashignoruje znaki NUL.