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 $PS2nach Eingabe eines baumelnden Zitats darauf achten. Wenn die Shell gedruckt wird, liegt dies $PS2daran, dass sie nur einen Block Ihrer Eingabe liest und noch nicht davon überzeugt ist, dass Sie fertig sind.
Der \nEinfachheit 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+Vdann CTRL+J- denn letzteres ist normalerweise das \nEingeben einer wörtlichen Ewline. Sie werden wissen, dass es funktioniert, wenn Sie es nicht sehen, $PS2weil 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+Vkann auf andere Weise sinnvoll angewendet werden - zum Beispiel "$(printf \\33)"ist dies nicht die einzige Möglichkeit, ein ESCZeichen 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+Vauch in unbekannten Umgebungen funktionieren, funktioniert dies für mich.