如何在 Linux 中禁用终端控制转义序列?

如何在 Linux 中禁用终端控制转义序列?

我正在编写与运行 busybox Linux 版本的嵌入式设备交互的软件。基本上,我只是向设备发送命令并解析命令的输出。这些命令要么直接在 linux shell 上执行,要么在设备上运行的内部 CLI 应用程序的命令行上执行。

一切正常,只是输出中充斥着终端控制转义序列在诸如 teraterm 或 putty 之类的终端应用程序上,这些转义序列可以执行诸如将错误颜色变为红色等实用功能,从而提供令人愉悦的用户界面。

问题是我必须以编程方式解析命令的输出并考虑输出中的“(esc)[2k”之类的内容。

例如,我发送命令“my-cmd”的典型发送/接收交互将会像这样......

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

我真正想要做的是关闭这些转义序列。这是可以在会话开始时在命令 shell 上完成的事情吗?还是除了过滤输出之外没有其他方法可以解决这个问题?

答案1

大多数(如果不是全部)情况下,*nix 命令无需用户使用选项明确要求即可打印彩色输出,这涉及到别名。事实上,许多 Linux 发行版都包含一个别名,用于lsgrep全局 中指定颜色/etc/bash.bashrc

这些来自我的 Linux Mint Debian 版本:

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

因此,如果您的程序通过 BASH 调用这些命令,那么您正在运行ls --color=auto而不是ls

你可以通过以下方法绕过 BASH 中的别名(也许其他 shell 也可以,但我没有尝试过)(摘自这里):

  1. 命令的完整路径名:/bin/ls

  2. 命令替换:$(which ls)

  3. 内置命令:command ls

  4. 双引号:"ls"

  5. 单引号:'ls'

  6. 反斜杠字符:\ls

如果您在软件中使用其中一种方法,则不必担心转义序列。

答案2

如果你使用的是 redhat 或者类似 fedora 或 centos 的系统,你可以考虑
修改

/etc/sysconfig/init

查找类似这样的行:

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

 BOOTUP=color

就像它说的那样,将变量更改为“颜色”以外的任何值

这会影响某些系统命令行实用程序的行为,如服务、ifup、ifdown 等。

相关内容