Mam skrypt powłoki Bash, w którym chciałbym wstrzymać wykonywanie, dopóki użytkownik nie naciśnie klawisza. W systemie DOS można to łatwo zrobić za pomocą polecenia „pauza”. Czy w skrypcie jest odpowiednik systemu Linux?
236
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
"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.Press a key to continue...
nawet początkujący użytkownicy będą mogli znaleźća
klucz i nacisnąć go; o)command | myscript.sh
lubmyscript.sh | command
. Zobacz tę odpowiedź, aby znaleźć rozwiązanie.read: 1: read: Illegal option -n
polecenie, zapakuj swoje poleceniebash -c 'command && command'
itp., Ponieważ prawdopodobnie wystąpił ten błądsh
. 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.
Polecenia
Wprowadź rozwiązanie
Rozwiązanie ucieczki (z -d $ '\ e')
Dowolne kluczowe rozwiązanie (z -n 1)
Pytanie z wybranym wyborem (z -ei $ 'Y')
Limit czasu (z -t 5)
Usprawniony alias
Wyjaśnienie
-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 $?
źródło
-s
;man read
iread --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 #osxread -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.read
bez żadnych parametrów będzie kontynuowane tylko po naciśnięciu Enter. Polecenie DOSpause
będzie kontynuowane po naciśnięciu dowolnego klawisza. Użyj,read –n1
jeśli chcesz tego zachowania.źródło
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 ...
Zauważ, że zmienną należy podać jako argument dla
read
.źródło
read -n1
nie jest przenośny. Przenośnym sposobem na zrobienie tego samego może być:Oprócz użycia
read
, po prostu naciśnij,ENTER
aby kontynuować monit, możesz:źródło
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.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.
źródło
Spróbuj tego:
źródło
Ta funkcja działa zarówno w trybie, jak
bash
izsh
zapewnia we / wy do terminala:Włóż to
.{ba,z}shrc
do Wielkiej Sprawiedliwości!źródło
Tak, aby użyć
read
- i jest kilka poprawek, które sprawiają, że jest najbardziej przydatny zarównocron
w terminalu, jak i w nim.Przykład:
-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.
źródło