Якщо ви додасте | sed -n l
до цієї tail
команди, щоб показати символи, що не друкуються, ви, ймовірно, побачите щось на зразок:
N\bNA\bAM\bME\bE
Тобто кожен символ пишеться як X
Backspace X
. На сучасних терміналах символ в кінцевому підсумку пишеться над собою (як Backspace aka BS aka \b
aka ^H
- символ, який переміщує курсор на один стовпець ліворуч) без різниці. Але в стародавніх машинках-машинках це може призвести до того, що персонаж з'являється жирним шрифтом, оскільки він отримує вдвічі більше чорнила.
Тим не менш, пейджери на зразок more
/ less
дій розуміють, що цей формат означає жирний, так що це все ще roff
означає, що виводити жирний текст.
Деякі реалізовані люди закликають roff
таким чином, що ці послідовності не використовуються (або внутрішньо викликають, col -b -p -x
щоб зняти їх, як у випадку man-db
реалізації (якщо не встановлена MAN_KEEP_FORMATTING
змінна середовище)), і не викликати пейджер, коли вони виявляють вихід не збирається в термінал (так man bash | grep NAME
би працював там), але не ваш.
Ви можете використовувати col -b
для видалення цих послідовностей (існують інші типи ( _
BS X
), а також для підкреслення).
Для систем, що використовують GNU roff
(наприклад, GNU або FreeBSD), ви можете уникнути використання цих послідовностей в першу чергу, переконавшись, що -c -b -u
варіанти передаються grotty
, наприклад, переконавшись, що -P-cbu
параметри передані groff
.
Наприклад, створивши скрипт для обгортки, який називається, groff
що містить:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Що ви попереду / usr / bin / groff $PATH
.
За допомогою macOS ' man
(також використовуючи GNU roff
) ви можете створити man-no-overstrike.conf
:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
І дзвоніть man
як:
man -C man-no-overstrike.conf bash | grep NAME
Але все ж із GNU roff
, якщо ви встановлюєте GROFF_SGR
змінну середовища (або не встановлюєте GROFF_NO_SGR
змінну залежно від того, як встановлені параметри за замовчуванням під час компіляції), тоді grotty
(доки вона не буде передана -c
опція) замість цього використовуватиметься послідовність аварійних терміналів ANSI SGR з цих хитрощів BS для атрибутів символів. less
зрозуміти їх, коли викликається з -R
опцією.
Чоловік FreeBSD зателефонує за grotty
допомогою цієї -c
опції, якщо ви не вимагаєте кольорів , встановивши змінну MANCOLOR (у такому випадку -c
не передається grotty
та grotty
повертається до типового використання там, де використовуються послідовності відбору ANSI SGR).
MANCOLOR=1 man bash | grep NAME
буде працювати там.
У Debian GROFF_SGR не є типовим. Якщо ти зробиш:
GROFF_SGR=1 man bash | grep NAME
однак, оскільки man
stdout 's не є терміналом, він бере на себе також передачу GROFF_NO_SGR
змінної grotty
(я вважаю, що вона може використовувати col -bpx
для зчитування послідовностей BS, оскільки col
не знає, як знімати послідовності SGR, хоча вона все ще є робить це з MAN_KEEP_FORMATTING
), що перекриває наше GROFF_SGR
. Ви можете зробити замість цього:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(у терміналі), щоб мати послідовності втечі SGR.
Цього разу ви помітите, що деякі з цих імен з’являються жирним шрифтом на терміналі (і в less -R
пейджері). Якщо ви подаєте вихід на sed -n l
( MANPAGER='sed -n /NAME/l'
), ви побачите щось на кшталт:
\033[1mNAME\033[0m$
Де \e[1m
послідовність включення жирних в ANSI-сумісних терміналів, і \e[0m
послідовність для повернення всіх атрибутів SGR до стандартних.
Цей текст grep NAME
працює так, як цей текст містить NAME
, але у вас все ще можуть виникнути проблеми, якщо шукати текст, де лише його частини виділено жирним шрифтом / підкреслюють ...