Как отключить управляющие последовательности управления терминалом в Linux?

4203
Angelo

Я пишу программное обеспечение, которое взаимодействует со встроенным устройством под управлением версии busybox Linux. По сути, я просто отправляю команды на устройство и анализирую выходные данные команд. Команды выполняются либо непосредственно в оболочке linux, либо в командной строке внутреннего приложения CLI, работающего на устройстве.

Все работает отлично, за исключением того, что вывод усеян управляющими последовательностями управления терминалом . В терминальных приложениях, таких как teraterm или putty, эти escape-последовательности выполняют полезные функции, такие как ошибки цвета красного цвета и другие приятные функции для приятного пользовательского интерфейса.

Проблема в том, что я должен программно анализировать выходные данные команд и учитывать такие вещи, как "(esc) [2k" в выходных данных.

Например, типичное взаимодействие при отправке и получении, когда я отправляю команду «my-cmd», будет выглядеть следующим образом ...

[send] my-cmd [receive] my-cmd <esc>[2Kprompt> my-cmd output of the command prompt>  

Что я действительно хотел бы сделать, это отключить эти escape-последовательности. Это можно сделать в командной оболочке в начале сеанса? Или нет другого способа, кроме как отфильтровать вывод?

5
Возможно, есть лучший способ, но вы можете сделать это для каждой отдельной команды. Какие команды вы отправляете? Я имею в виду, что ls - это псевдоним для ls --colors = tty, а grep указывает на grep - color и тому подобное. Вы можете избежать escape-последовательностей, если вы используете, например, `/ bin / ls` вместо` ls`. terdon 11 лет назад 1
@terdon есть более простой способ. просто используйте `\ ls` вместо` ls`, и он пропустит все псевдонимы. mnmnc 11 лет назад 1
@mnmnc хороший, я этого не знал, спасибо! terdon 11 лет назад 0
Вау, спасибо! Я попробую это с помощью команд оболочки. Применяется ли префикс обратной косой черты к командам оболочки _all_? Жаль, что нет способа глобально отключить поведение. Также я должен надеяться, что внутренние команды ведут себя правильно. Angelo 11 лет назад 0
Я только что узнал об этом полчаса назад, но на самом деле это способ цитирования. Указанное в кавычках имя команды заставляет BASH игнорировать любые псевдонимы. Он должен работать со всеми _aliases_ не всеми командами, но большинство случаев, когда у вас есть цветной вывод без указания опции, являются псевдонимами. Посмотрите [здесь] (http://stackoverflow.com/q/6162903/1081936) для получения дополнительной информации. terdon 11 лет назад 1
Перенаправление вывода (например, через `cat`, в файл или именованный канал) также может работать. Вы также получите полный (не усеченный) вывод от таких команд, как `ps aux`, которые часто страдают от недостаточно широких экранов. Daniel Beck 11 лет назад 1

2 ответа на вопрос

3
terdon

В большинстве (если не во всех) случаях, когда команда * nix печатает цветной вывод без специального запроса пользователя с опцией псевдонимов. Фактически, во многих дистрибутивах Linux есть псевдоним для lsи grepопределения цветов в глобальном /etc/bash.bashrc.

Это из моего Linux Mint Debian Edition:

$ grep alias /etc/bash.bashrc alias ls='ls --color=auto' alias grep='grep --colour=auto' 

Итак, если ваша программа вызывает эти команды через BASH, вы работаете ls --color=autoвместо ls.

Вы можете обойти псевдонимы в BASH (возможно, и другие оболочки, но я не пробовал) следующими способами (взяты отсюда ):

  1. полный путь к команде: /bin/ls

  2. подстановка команд: $(which ls)

  3. встроенная команда: command ls

  4. двойные кавычки: "ls"

  5. одинарные кавычки: 'ls'

  6. символ обратной косой черты: \ls

Если вы используете один из этих методов в своем программном обеспечении, вам не нужно беспокоиться о escape-последовательностях.

0
xyzzy71

if you're on redhat or a relative, like fedora or centos, you might look at
modifying

/etc/sysconfig/init 

look for the lines that say something like:

 # anything else => new style bootup without ANSI colors or positioning BOOTUP=color 

and like it says, change the variable to anything other than "color"

this affects behavior of some of the system command line utilities, like service, ifup, ifdown, etc.

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