Jeden aspekt tego problemu tak naprawdę nie dotyczy awk
- i tylko trochę o powłoce. Problem polega na tym, że na standardowym, kanonicznym tty przez większość czasu dyscyplina tty jądra buforuje twoje dane wejściowe - po prostu odbijają je na ekranie i nigdzie indziej - aby mógł skutecznie obsługiwać odstępy wsteczne i tym podobne.
Jednak gdy naciśniesz klawisz Return lub w inny sposób wprowadzisz nowy wiersz, wszystkie buforowane dane zostaną natychmiast przekazane do aplikacji do czytania - zwykle do powłoki. Możesz to zaobserwować, obserwując $PS2
po wprowadzeniu wiszącego cytatu. Gdy powłoka drukuje $PS2
, dzieje się tak, ponieważ po prostu odczytuje jakiś blok danych wejściowych i nie jest jeszcze przekonana, czy to koniec.
Tak więc, dla wygody, potrzebujesz jakiegoś sposobu wysłania \n
ewline do bufora terminala bez konieczności natychmiastowego wypychania wszystkich innych danych wejściowych. Standardowym sposobem na to jest sekwencja klawiszy CTRL+V
- która podaje terminalowi twój następny znak wejściowy. Zrób CTRL+V
to CTRL+J
- ponieważ to drugie jest zwykle jak \n
napisać dosłowną ewline. Będziesz wiedział, że zadziałało, gdy nie widzisz, $PS2
ponieważ powłoka nadal nie odczytała danych wejściowych.
Zauważ jednak, że jeśli nie przeczytałem, że wejście wcześniejszej CTRL+V
będzie dokonały żadnego znaczenia dla powłoki w ogóle - że tylko cytuje go w składzie dyscypliny. Na pewno będziesz chciał zacytować nowy wiersz, a także zrobić z nim coś sensownego.
Nawiasem mówiąc, CTRL+V
może być użytecznie zastosowany na inne sposoby - na przykład "$(printf \\33)"
nie jest to jedyny sposób na zapisanie ESC
znaku w skrypcie powłoki - i nie jest nawet najprostszy. Możesz dosłownie wprowadzić dowolny znak, który wyśle klawiatura, bez próby jego interpretacji przez sterownik wejściowy, jeśli po prostu w ten sposób uciec.
Często lubię używać <tab> w wierszu poleceń bez powłoki, która próbuje cokolwiek ukończyć. Ponieważ powłoki, które wykonują uzupełnianie, zwykle konfigurują <tab> w sposób synonimiczny stty eol \t
, aby ich systemy uzupełniające działały, CTRL+V
działa dla mnie nawet w nieznanym środowisku.