Ein Aspekt dieses Problems betrifft nicht wirklich awk
- und nur ein wenig die Shell. Das Problem ist, dass auf einem standardmäßigen, kanonischen tty die meiste Zeit die tty-Disziplin des Kernels Ihre Eingaben puffert - sie wird nur auf Ihrem Bildschirm und nirgendwo anders wiedergegeben -, damit sie effizient mit Rückständen und Ähnlichem umgehen können.
Wenn Sie jedoch die Eingabetaste drücken oder auf andere Weise eine neue Zeile eingeben, werden alle diese gepufferten Daten auf einmal an die Leseanwendung gesendet - normalerweise an Ihre Shell. Sie können dies beobachten, indem Sie $PS2
nach Eingabe eines baumelnden Zitats darauf achten. Wenn die Shell gedruckt wird, liegt dies $PS2
daran, dass sie nur einen Block Ihrer Eingabe liest und noch nicht davon überzeugt ist, dass Sie fertig sind.
Der \n
Einfachheit halber benötigen Sie also eine Möglichkeit, eine Ewline in den Terminalpuffer zu senden, ohne die gesamte andere Eingabe sofort verschieben zu müssen. Der üblicher Weg , dies zu tun ist , w / die Schlüsselsequenz CTRL+V
- das Anführungszeichen für das Terminal Ihrer nächsten Eingabezeichen. Tun Sie es CTRL+V
dann CTRL+J
- denn letzteres ist normalerweise das \n
Eingeben einer wörtlichen Ewline. Sie werden wissen, dass es funktioniert, wenn Sie es nicht sehen, $PS2
weil die Shell Ihre Eingabe immer noch nicht gelesen hat.
Beachten Sie aber , dass , wenn es nicht gelesen , dass die Eingabe Ihrer früheren CTRL+V
überhaupt keinen Unterschied für die Schale gemacht haben - , dass zitiert es nur für die Linie Disziplin. Sie sollten auf jeden Fall auch die Newline zitieren, um etwas Sinnvolles daraus zu machen.
Übrigens, CTRL+V
kann auf andere Weise sinnvoll angewendet werden - zum Beispiel "$(printf \\33)"
ist dies nicht die einzige Möglichkeit, ein ESC
Zeichen in ein Shell-Skript zu schreiben - und es ist nicht einmal die einfachste. Sie können buchstäblich jedes Zeichen eingeben, das Ihre Tastatur sendet, ohne dass der Eingabetreiber versucht, es zu interpretieren, wenn Sie es zuerst auf diese Weise verlassen.
Ich verwende oft gerne <tab> s in der Befehlszeile, ohne dass die Shell versucht, etwas zu vervollständigen. Da Shells, die eine Vervollständigung ausführen, <tab> normalerweise so konfigurieren stty eol \t
, dass ihre Vervollständigungssysteme CTRL+V
auch in unbekannten Umgebungen funktionieren, funktioniert dies für mich.