21

我有一个生成 motd 的 bash 脚本。问题取决于某些终端设置,我不确定颜色是否会延伸到行尾。有时它不会:

例如

正方形

对比

锯齿状的

IIRC 一个只是普通的 gnome 终端,另一个是我的 tmux 术语。所以我的问题是如何让它扩展到 80 个字符(或真正扩展到终端宽度)。当然我可以填充到 80 个字符,但这并不能解决问题。

这是我生成motd的代码片段:

TC_RESET="^[[0m"                                                                
TC_SKY="^[[0;37;44m"                                                            
TC_GRD="^[[0;30;42m"                                                            
TC_TEXT="^[[38;5;203m"   

echo -n "${TC_SKY}                                                                              

... lots of printing..." 
echo -e "\n                           Welcome to Mokon's Linux!                           \n"

echo -n "${TC_GRD}"                                                             
nodeinfo # Just prints the info seen below...                                                                       
echo ${TC_RESET} 

如何以编程方式从 bash 更改终端设置或将颜色更改为行尾?

4

3 回答 3

20

也许使用Escape 序列清除到 EOL

出于某种原因(在我的 MacOS 终端上!)我只需要指定这个序列,然后它适用于所有行,但为了完整起见,我列出了所有

TC_RESET=$'\x1B[0m'
TC_SKY=$'\x1B[0;37;44m'
TC_GRD=$'\x1B[0;30;42m'
TC_TEXT=$'\x1B[38;5;203m'
CLREOL=$'\x1B[K'

echo -n "${TC_SKY}${CLREOL}"
echo -e "\n           ABC${CLREOL}\n"
echo -e "\n              DEFG${CLREOL}\n"

echo -n "${TC_GRD}"
echo -e "\n           ABC${CLREOL}\n"
echo -e "\n              DEFG${CLREOL}\n"
echo ${TC_RESET}
于 2013-11-18T21:28:41.340 回答
3

填充过滤器

不幸的是,您必须用确切数量的空格填充每一行以更改整行背景的颜色。

正如您所说的,我的解决方案将使用bashisms(在其他 shell 或旧版本的 bash 下不起作用)。

  • 语法printf -v VAR FORM ARGS分配给变量VAR然后结果sprintf FORM ARGS。那是bashism,在其他类型的shell下,您必须将这一行替换为TC_SPC=$(printf "%${COLUMNS}s" '')

你可以试试这个:

... lots of printing..." 
echo -e "\n                           Welcome to Mokon's Linux!                           \n"

echo -n "${TC_GRD}"

printf -v TC_SPC "%${COLUMNS}s" ''

nodeinfo |
    sed "s/$/$TC_SPC/;s/^\\(.\\{${COLUMNS}\\}\\) */\\1/" # Just prints the info seen below...

echo ${TC_RESET}

在此处输入图像描述 也许您必须确保$COLUMNS正确设置:

COLUMNS=$(tput cols)

如您所见,只有经过过滤的命令的结果sed是全彩色的。

您可以

  • 多次使用相同的过滤器:

    cmd1 | sed '...'
    cmd2 | sed '...'
    
  • 或将您的命令分组以仅使用一个过滤器:

    ( cmd1 ; cmd 2 ) | sed '...'
    

但是,如果您尝试过滤包含格式转义的输出,则会出现问题:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo $'\e[0m'
) | sed "
  s/$/$TC_SPC/;
  s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"

未终止的样本

Il 您必须填充以包含转义的行,您必须隔离它们:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo $'\e[0m'
) | sed "
  s/\$/$TC_SPC/;
  s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\([^\o033]\\{${COLUMNS}\\}\\) */\\1\\3/
"

在此处输入图像描述

最后能够填写终止很长的行:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo "This is a very very long long looooooooooong line that contain\
       more characters than the line could hold...";
    echo $'\e[0m';
) | sed "            
  s/\$/$TC_SPC/;
  s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\(\\([^\o033]\\{${COLUMNS}\\}\\)*\\) */\\1\\3/"

注意:这仅在格式化转义位于行首时才有效。

于 2013-11-14T20:17:50.653 回答
1

试试这个:

echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0
于 2013-11-14T02:13:28.930 回答