Один аспект этой проблемы на самом деле не о awk
- и только немного о оболочке. Проблема в том, что в стандартном, каноническом tty большую часть времени tty-дисциплина ядра буферизует ваш ввод - просто выводит его на экран и больше нигде - так, чтобы он мог эффективно обрабатывать возврат и тому подобное.
Однако, когда вы нажимаете return или иным образом вводите новую строку, все эти буферизованные данные сразу передаются в приложение для чтения - обычно в вашу оболочку. Вы можете наблюдать это, наблюдая за $PS2
введением висячей цитаты. Когда оболочка печатает, $PS2
это потому, что она просто читает какой-то блок вашего ввода и еще не убеждена, что вы прошли.
Итак, для удобства вам нужен какой-то способ отправки \n
ewline в буфер терминала без необходимости немедленной отправки всех этих других входных данных. Стандартный способ сделать это - w / последовательность клавиш CTRL+V
- которая указывает на терминал ваш следующий вводимый символ. Сделайте CTRL+V
тогда CTRL+J
- потому что последнее обычно, как печатать буквальный \n
ewline. Вы будете знать, что это работает, когда вы не видите, $PS2
потому что оболочка все еще не прочитала ваш ввод.
Обратите внимание , однако , что , когда он действительно читал , что ваш вход раньше CTRL+V
не будет никакой разницы для оболочки вообще - что только цитирует его линию дисциплины. Вы определенно захотите заключить в кавычки новую строку, чтобы сделать с ней что-нибудь значимое.
Кстати, CTRL+V
может быть с пользой применен другими способами - например, "$(printf \\33)"
это не единственный способ записать ESC
символ в сценарий оболочки - и он даже не самый простой. Вы можете буквально ввести любой символ, который будет отправлять ваша клавиатура, без попытки драйвера ввода интерпретировать его, если вы просто экранируете его таким образом.
Мне часто нравится использовать <tab> в командной строке, а оболочка не пытается что-либо завершить. Поскольку оболочки, выполняющие завершение, обычно настраивают <tab> таким образом stty eol \t
, чтобы их системы завершения работали, это CTRL+V
работает для меня даже в незнакомой среде.