【问题标题】:Extending terminal colors to the end of line将终端颜色扩展到行尾
【发布时间】:2013-11-11 20:22:32
【问题描述】:

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

例如

v.s.

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 更改终端设置或将颜色更改为行尾?

【问题讨论】:

  • 您可以在输入任何内容之前简单地刷新屏幕:echo $'\e[33;44;1m\e[H\e[J' 在您的脚本顶部。
  • @F.Hauri 谢谢。之后如何将屏幕恢复正常?

标签: bash terminal


【解决方案1】:

也许使用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}

【讨论】:

  • 谢谢!感谢其他也尝试过的人,但这个解决方案按我希望的方式工作。我做了一些改动。基本上我附加到一个临时文件,然后使用 send 用换行符和那个字符替换所有换行符。如果我不在每一行上都放那个转义序列,我只会在它的行上得到它......我会把它添加到你的答案中......
  • @DavidMokonBond 我的示例基于我在 Mac 上的实验,显然您使用的是更广泛的终端。所以我更新了我的答案 - 你能验证吗?
  • 我不使用tmux,报告的终端类型是什么(${TERM}),screen 上的行为是否相似?
  • 是的,它与屏幕非常相似。现在我只是通过 sed 发送它并将它填充到 80 个字符,这对我来说已经足够了。这是术语: i:echo ${TERM} screen-256color 谷歌搜索了一下后,我认为这可能是由于 tmux 不支持所有相同的术语功能,例如您正在使用的 eol 行之一,但我不太确定
  • clear-to-EOL 在标准终端的 OS X/macOS 上完美运行(最近在 OS X 10.11.6 上测试)。感谢这个伟大的提示!
【解决方案2】:

填充过滤器

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

正如您所说的 ,我的解决方案将使用 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/"

如果您必须填充以包含 转义符 的行,则必须将它们隔离:

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

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

【讨论】:

    【解决方案3】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2012-03-26
      • 2014-06-01
      • 1970-01-01
      • 2012-01-19
      • 2012-12-14
      • 2021-06-12
      相关资源
      最近更新 更多