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