我有一个生成motd的bash脚本。问题取决于一些终端设置,我不确定颜色是否会延伸到行尾。 Othertimes它没有:
e.g。
v.s。
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更改终端设置或将颜色更改为行尾?
答案 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)
不幸的是,你必须用每个行填充确切的空格数来改变整行背景的颜色。
当您谈到bash时,我的解决方案将使用 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}
也许你必须确保$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/"
你需要填充以包含转义的行,你必须隔离它们:
(
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/"
Nota:只有当格式化转义位于行的开头时才有效。
答案 2 :(得分:1)
试试这个:
echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0