В printf '%s\t%s\n' foo bar
, printf
робить вихід foo<TAB>bar<LF>
.
f
, o
, b
, a
І r
є однією шириною графічних символів.
Після отримання цих символів термінал відобразить відповідний гліф і перемістить курсор на один стовпець праворуч, якщо тільки він вже не досяг правого краю екрана (папір на оригінальних машинописних машинках)), і в цьому випадку він може подати рядок і поверніться до лівого краю екрана (обгортання) або просто відкиньте символ залежно від терміналу та способу його налаштування.
<Tab>
і <LF>
є двома контрольними символами. <LF>
(також новий рядок) - це роздільник рядків у тексті Unix, але для терміналів він просто подає рядок (перемістіть курсор на одну позицію вниз). Таким чином драйвер терміналу в ядрі фактично переведе його на <CR>
(повернення в лівий край екрану), <LF>
(курсор вниз) ( stty onlcr
як правило, за замовчуванням).
<Tab>
повідомляє терміналу перемістити курсор до наступної зупинки вкладки (яка на більшості терміналів за замовчуванням розташована на 8 позицій, але їх можна також налаштувати для встановлення в будь-якому місці), не заповнюючи пробіл пробілами.
Тож якщо ці символи надсилаються до терміналу з зупинками на вкладці кожні 8 стовпців, поки курсор знаходиться на початку порожнього рядка, це призведе до:
foo bar
надруковано на екрані в цьому рядку. Якщо вони будуть надіслані, поки курсор знаходиться на третьому положенні у рядку, який містить xxxxyyyyzzzz
, це призведе до:
xxfooyyybarz
На терміналах, які не підтримують табуляцію, драйвер терміналу можна налаштувати для перекладу цих вкладок у послідовності пробілів. ( stty tab3
).
Символ SPC в оригінальних машинописних машинках переміщуватиме курсор праворуч, тоді як backspace ( \b
) переміщує його вліво. Тепер у сучасних терміналах SPC переміщується вправо і також стирається (пише пробільний символ, як ви очікували). Тож кулон \b
повинен був бути чимось новішим, ніж ASCII. На більшості сучасних терміналів, насправді це послідовність символів: <Esc>
, [
, C
.
Існує більше послідовностей евакуації для переміщення n
символів вліво, вправо, вгору, вниз або в будь-яку позицію на екрані. Існують і інші послідовності евакуації для видалення (заповнення порожнім) частин рядків або областей екрана тощо.
Ці послідовності , як правило , використовується візуальними додатками , таких як vi
, lynx
, mutt
, dialog
де текст написаний в довільних позиціях на екрані.
Тепер усі емулятори терміналів X11 та деякі інші не-X11 такі, як GNU, screen
дозволяють вам вибирати області екрану для копіювання. Коли ви вибираєте частину побаченого в vi
редакторі, ви не хочете копіювати всі послідовності евакуації, які використовувались для отримання цього виводу. Ви хочете вибрати текст, який ви бачите там.
Наприклад, якщо ви працюєте:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
Що імітує редактор сеансу , коли ви входите abC
, повернутися до початку, замініть ab
з AC
, C
з B
, перейти на наступну позицію табуляції, а потім ще один стовпець вправо, потім два стовпці зліва, а потім ввести D
.
Розумієш:
ABC D
Тобто, ABC
проміжок у 4 стовпчиках і D
.
Якщо ви виберете, що за допомогою миші вказується xterm
або putty
, вони зберігатимуть у ABC
виділеному знаку 4 пробіли та D
, ні abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
.
У виборі закінчується те, що було надіслано, printf
але після обробки як драйвером терміналу, так і емулятором терміналу.
Для інших видів трансформації див. <U+0065><U+0301>
(З e
подальшим поєднанням гострого акценту), змінений на <U+00E9>
( é
заздалегідь складена форма) на xterm
.
Або echo abc
це в кінцевому підсумку переводиться ABC
драйвером терміналу перед відправкою в термінал після stty olcuc
.
Зараз, <Tab>
начебто, <LF>
це один з тих небагатьох керуючих символів, які насправді іноді зустрічаються у текстових файлах (також <CR>
у текстових файлах MSDOS, а іноді і <FF>
при розриві сторінки).
Тому деякі емулятори терміналів вирішують скопіювати їх, коли це можливо, в буфери копіювання-вставки, щоб зберегти їх (це, як правило, не має значення <CR>
ні <LF>
хоч).
Наприклад, у терміналах на базі VTE gnome-terminal
, можливо, ви побачите, що, коли ви вибираєте вихід printf 'a\tb\n'
на порожній рядку, gnome-terminal
насправді зберігається a\tb
у виді X11 замість a
7 пробілів і b
.
Але для виведення printf 'a\t\bb\n'
, він зберігає a
, 6 місць і b
, і для printf 'a\r\tb\n'
, a
, 7 просторів і b
.
Є й інші випадки, коли термінали намагаються скопіювати фактичний вхід, як, наприклад, після вибору двох рядків після запуску, printf 'a \nb\n'
де буде збережено цей невидимий простір. Або при виборі двох рядків не міститься символ LF, коли два рядки є результатом обгортання з правого поля.
Тепер, якщо ви хочете зберегти вихід printf
у CLIPBOARD X11
select, найкраще це зробити безпосередньо так:
printf 'foo\tbar\n' | xclip -sel c
Зверніть увагу , що при вставці , що xterm
і більшість інших терміналів, xterm
фактично замінює , що \n
з , \r
тому що це символ xterm
посилає при натисканні Enter(і драйвер терміналу може перевести його назад \n
).