Mam następujący skrypt bash:
# do some time consuming task here
read -p "Give me some input: " input
Teraz, jak można się domyślać, jeśli użytkownik naciśnie jakieś losowe klawisze podczas „czasochłonnego zadania”, niechciane dane są również brane pod uwagę. Jak wyczyścić stdin
(a przynajmniej zignorować) przed wydaniem polecenia odczytu?
Odpowiedzi:
Nie sądzę, że istnieje sposób na wyczyszczenie standardowego wejścia, ale (za pomocą bash) możesz przeczytać i odrzucić to, co tam jest, zanim poprosisz o dane wejściowe
Odczytuje to stdin i ma limit czasu 1 sekundy, ale kończy się niepowodzeniem, jeśli w stdin jest więcej niż 10000 znaków. Nie wiem, jak duży możesz zrobić parametr nchars.
źródło
W Bash 4 możesz ustawić
-t
(limit czasu) na0
. W takim przypadkuread
natychmiast wraca ze statusem wyjścia wskazującym, czy dane czekają, czy nie:źródło
Odczytuje to wiele wierszy danych wejściowych, jeśli użytkownik przypadkowo naciśnie przycisk, aby wejść wielokrotnie
źródło
to działało dla mnie dobrze:
źródło
-e
w tym przypadku?Dołącz czasochłonne zadanie do bloku, którego standardowe wejście jest zamknięte:
źródło
read
nadal będzie czytać pierwszą linię wprowadzoną podczas# time consuming
zadania. Ponadto, jeśli skrypt nie zawiera żadnych poleceń, które czytają stdin po tymread
czasie, nieprzeczytane linie są wykonywane na interaktywnym terminalu po zakończeniu skryptu. Czy ktoś pomyślnie to przetestował?Opierając się na odpowiedzi christophjaegera, dodałem
-s
, aby dane wejściowe nie były powtarzane na terminalu i-n
aby nie czekał na nową linię.źródło
-n
jest dobrym pomysłem, ale dwie poprzednie odpowiedzi już o tym wspominały. Biorąc pod uwagę, że celem tego ćwiczenia jest przeczytanie i odrzucenie czegokolwiek, co zostało wpisane przedread
wykonaniem , nie rozumiem, co według ciebie będzie dobre-s
.źródło