Kiedy czytasz całą linię zwykłym read
(lub read -r
innym opcjom, które nie wpływają na to zachowanie), dostarczony przez jądro edytor linii rozpoznaje Backspaceklawisz do usunięcia jednego znaku, a także kilka innych poleceń (w tym Returndo zakończenia wprowadzania linii i wyślij go). Klawisze skrótów można skonfigurować za pomocą stty
narzędzia. Mówi się, że terminal jest w trybie gotowym, gdy jego edytor linii jest aktywny. W trybie raw każdy znak wpisany na klawiaturze jest natychmiast przesyłany do aplikacji. W trybie gotowania znaki są przechowywane w buforze, a do aplikacji przesyłane są tylko pełne linie.
Aby zatrzymać czytanie po określonej liczbie znaków w celu zaimplementowania read -n
, bash musi przełączyć się w tryb raw. W trybie surowym terminal nie wykonuje żadnego przetwarzania Backspaceklucza (do czasu naciśnięcia Backspacepoprzedni znak został już wysłany do bash), a bash również nie wykonuje żadnego przetwarzania (prawdopodobnie dlatego, że daje to większą elastyczność zezwalając skryptowi na wykonanie własnego przetwarzania).
Możesz przekazać opcję -e
włączenia własnego edytora wiersza bash (readline, który jest poprawnym edytorem wierszy, nie tak jak ten niezwykle surowy jądro). Ponieważ bash wykonuje edycję liniową, może przestać czytać, gdy ma żądaną liczbę znaków.
Gilles „SO- przestań być zły”
źródło
read
odczytana jest „liczba wprowadzonych znaków”, pozostaje bez odpowiedzi.