将终端颜色延伸到行尾

时间:2013-11-11 20:22:32

标签: bash terminal

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

e.g。

square

v.s。

jagged

IIRC只是普通的gnome-terminal,另一个是我的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更改终端设置或将颜色更改为行尾?

3 个答案:

答案 0 :(得分:15)

也许使用Escape sequence to clear-to-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}

答案 1 :(得分:3)

填充过滤器

不幸的是,你必须用每个行填充确切的空格数来改变整行背景的颜色。

当您谈到时,我的解决方案将使用 bashisms (不会在其他shell或旧版本的bash下运行)。

  • 语法printf -v VAR FORM ARGS分配给变量VAR,然后分配sprintf FORM ARGS的结果。这是基础,在其他类型的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}

enter image description here 也许你必须确保$COLUMNS被正确设置:

COLUMNS=$(tput cols)

如您所见,只有sed过滤的命令结果才会完全着色。

你可以

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

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

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

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

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

unterminated sample

你需要填充以包含转义的行,你必须隔离它们:

(
    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/
"

enter image description here

最后能够填补非常长的行:

(
    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/"

Nota:只有当格式化转义位于行的开头时才有效。

答案 2 :(得分:1)

试试这个:

echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0