Почему разделитель единицы (ASCII 31) невидим в терминальном выводе?

Самый легкий способ сделать это должно включить монитор в порт для GPU, который Вы хотите использовать и не включаете монитор в порт для GPU, который Вы не хотите использовать. Затем запустите компьютер.

17
05.05.2014, 23:49
3 ответа
[118128]Символ разделителя единиц ([118492]US[118493]), также известный как [118494]IS1[118495], находится в классе символов [118496]cntrl[118497] и является [118498]не[118499] в классе символов [118500]print[118501]. Это управляющий символ, предназначенный для организации текста в группы, [118502] для программ, которые предназначены для использования этой информации [118503]. В общем, непечатаемые символы, вероятно, будут интерпретироваться и выводиться по-разному в разных программах или окружениях.

Причина, по которой в Vim он представлен как [118504]^_[118505], заключается в том, что Vim является интерактивным редактором. Он может свободно отображать непечатаемые символы, как ему заблагорассудится, при условии, что правильный двоичный символ записан на диск.

Вы не можете получить такого же поведения в оболочке, потому что программы оболочки Unix написаны для работы и передачи простого текста друг другу. Когда вы [118506]cat[118507] записываете файл, текст, который записывается на терминал, должен быть тем, что на самом деле находится в файле.

Так что остаётся только интерпретировать символ на терминальном устройстве. И получается, что некоторые терминальные эмуляторы [118508] do[118509] выдают символ [118510]US[118511] иначе, чем другие. В [118512]gnome-терминале [118513] (или любом другом терминале [118514]vte[118515]) символ будет выдан в виде ящика, содержащего шестнадцатеричный код [118516]001F[118517]. В [118518]xterm[118519] или [118520]rxvt[118521] символ действительно невидим.[118135].

19
27.01.2020, 19:46
[118136] Разделитель единиц находится в диапазоне ASCII [118522] управляющих символов [118523] и поэтому не имеет (или не должен иметь обычно) визуального представления.

Vim и некоторые другие редакторы отображают их, поэтому их можно редактировать. Как вы заметили, [118524]cat -v[118525] отображает их тоже. На man-странице видно, что [118526]-v[118527] - это короткая форма [118528]- show-nonprinting[118529], что приводит к замене непечатаемых символов на печатаемое представление, которое не является оригинальным содержимым файла и поэтому может вызвать проблемы, если вывод будет на самом деле осуществлен в другой программе.

Представление, которое вы уже видите, намекает на то, что это управляющий символ: символ, дополненный [118530]^[118531], является общей нотацией для [118532]Ctrl[118533] + символ, который является комбинацией клавиш, генерирующей этот символ в терминале. [118534]Ctrl[118535]+[118536]_[118537] позволяет, например, ввести разделитель устройств в формате vim. Но другой редактор или какая-нибудь программа для просмотра графического интерфейса может отображать шестнадцатеричный код, плацдарм или что-то совершенно другое.

Так как ваш терминал не печатает управляющие символы, он также не копируется при выделении текста (пробельные символы, такие как newline и tab являются здесь исключением, которые также являются управляющими символами). Другим примером символов управления в терминале, которые обычно игнорируются при копировании, являются цветовые коды, которые представляют собой символ [118538]ESC[118539], за которым следует код для раскрашивания текста.

Таким образом, чтобы показать символы на терминале, нет другого способа, кроме как использовать программу, которая заменяет разделитель устройств каким-либо символом для печати.[118145].

10
27.01.2020, 19:46

Немного позади других (очень хороших) ответов, если вы хотите изменить только управляющий символ ^_ при отображении содержимого файла, вы можете захотеть перевести его, используя утилиту tr (и немного баш-совместимого синтаксиса):

# Replace the control character US (^_) by *one* other character
$ cat my.file | tr $'\c_' ':'

Если вам нужно заменить этот управляющий символ на его "расширенный" вид, вам понадобится sed вместо:

# Replace the control character US (^_) by any string
cat /tmp/f | sed s/$'\c_'/^_/g

Пожалуйста, обратите внимание на синтаксис $'\cX': этот синтаксис информирует ваш (bash-совместимый shell) о замене соответствующего управляющего символа. Смотрите в Википедии список псевдонимов управляющих символов с использованием "caret notation". Если вам не нравится этот синтаксис, вы можете предпочесть использовать восьмеричную $'\037' или шестнадцатиричную $'\x1f' нотацию вместо этого.

.
3
27.01.2020, 19:46

Теги

Похожие вопросы