Linux Bash shell : Leaving some ANSI codes (moSTLy color) and not interpreting some others from string in a function call

标签 linux bash shell ansi-escape

这是我的 case 函数的一个例子:

function SendToScreen(){
echo -e "$*"
}

所以我这样调用它:

SendToScreen "Hello"

而且,如果我想添加颜色代码:

VioletForeGroundColor="\033[38;5;99m"
NormalColor="\033[0m"
SendToScreen "Hello"$VioletForeGroundColor" violet "$NormalColor" word."

这给了我一个正确的:

ANSI codes OK
但是如果我想发送一些 DOS 类型的路径(包括 \ 斜杠),问题 就来了:

VioletForeGroundColor="\033[38;5;99m"
NormalColor="\033[0m"
MyDOSPath="d:\vivisector"
SendToScreen "Hello"$VioletForeGroundColor" violet "$NormalColor" word. The path is $MyDOSPath"

因为\v是某种ANSI代码,所以这次我得到:

ANSI codes problem
我需要我的函数来输出彩色文本(粗体、草书、下划线...等),所以我必须使用 echo -e

我怎样才能解决这样烦人的控制代码与 \v 这样的字符冲突的问题(我想还会有其他的)?

我想通过修改函数来修复问题,但我不确定这是不是正确的方法。

谢谢。

EDIT-1:我们将选择 \033 也称为 \e 作为唯一需要保留的 ANSI 代码。

最佳答案

新答案:

function SendToScreen() {
    echo -e $(echo "${*//\\/\\\\}" | sed 's/\\\\033\[/\\033\[/g');
}

这个转义所有内容,然后取消转义任何看起来像颜色序列 (\033[) 的内容。将文件名作为颜色序列发送的可能性大大降低。您可以通过仅将您想要允许的那些颜色序列列入白名单,并将 sed 命令更改为一系列 sed 命令来进一步减少它,这些命令将取消转义那些确切的序列。

旧答案: 假设你想转义\v 和\n,你可以这样做:

function SendToScreen(){
    a="${*//\\v/\\\\v}"
    a="${a//\\n/\\\\n}"
    echo -e "$a"
}

您可以使用您不想处理的任何其他转义来扩展它。

关于Linux Bash shell : Leaving some ANSI codes (moSTLy color) and not interpreting some others from string in a function call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095449/

相关文章:

c - 如何在日志文件中引入日期和时间

linux - Qt Designer 和 Qt Assistant 启动时出现段错误

reactjs - Makefile 命令在子文件夹中运行 react 测试套件

c - 终端如何从标准输出读取并在屏幕上绘制文本?

linux - 打印矩阵的对角线

linux - 如何在 IE 中使用 Linux 进行测试

mysql - 在 Ubuntu 上使用 APT 安装的 MySQL 的 BASEDIR 在哪里?

bash - 在 bash 中使用 printf() 在一行中打印多个单词

r - Shell bash 脚本不运行 R

shell - Emacs shell 脚本 - 如何将初始选项放入脚本中?