我正在编写与运行 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 发行版都包含一个别名,用于ls
在grep
全局 中指定颜色/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 也可以,但我没有尝试过)(摘自这里):
命令的完整路径名:
/bin/ls
命令替换:
$(which ls)
内置命令:
command ls
双引号:
"ls"
单引号:
'ls'
反斜杠字符:
\ls
如果您在软件中使用其中一种方法,则不必担心转义序列。
答案2
如果你使用的是 redhat 或者类似 fedora 或 centos 的系统,你可以考虑
修改
/etc/sysconfig/init
查找类似这样的行:
# anything else => new style bootup without ANSI colors or positioning
BOOTUP=color
就像它说的那样,将变量更改为“颜色”以外的任何值
这会影响某些系统命令行实用程序的行为,如服务、ifup、ifdown 等。