Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Unset background colour in shell script
Inspired by the screenshots in this otherwise unrelated article https://itsfoss.com/tennis-csv-tool/ I'd like to highlight some lines in the terminal output of one of my zsh shell scripts.
Here a simplified version of what I puzzled together (the complete version is at the end of the post):
middeco=$'\n\e[38;5;208;48;5;214m\e[39m\e[38;5;231m'
stopdeco=$'\e[0;38;5;214m\e[0m\e[48;5;X'
file="some text"
echo "${middeco} $file ${stopdeco}"
file="some text some text some text some text some text some text some text some text some text some text some text some text some text text some text some text "
echo "${middeco} $file ${stopdeco}"
file="some text some text some text some text some text some text some text some text some text some text text some text some text "
echo "${middeco} $file ${stopdeco}"
This works fine for short and long texts, but for medium length texts, the background colour starts to reappear towards the end of the second line (highlighted by the freehand circle in the screenshot).
Is there any way to avoid this?
Environment:
- macOS Terminal.app v.2.15
- window width: 96 columns
- zsh v5.9
Just for completeness here the complete script including the nerdfont characters:
startdeco=$'\n\e[38;5;202m\e[38;5;231;48;5;202m'
middeco=$'\e[38;5;202;48;5;208m\e[38;5;208;48;5;214m\e[39m\e[38;5;231m'
stopdeco=$'\e[0;38;5;214m\e[0m\e[48;5;X'
file="some text"
echo "${startdeco}Reason: ${middeco} $file ${stopdeco}"
file="some text some text some text some text some text some text some text some text some text some text some text some text text some text some text "
echo "${startdeco}Reason: ${middeco} $file ${stopdeco}"
file="some text some text some text some text some text some text some text some text some text some text text some text some text "
echo "${startdeco}Reason: ${middeco} $file ${stopdeco}"
1 answer
The following users marked this post as Works for me:
| User | Comment | Date |
|---|---|---|
| samcarter | (no comment) | Apr 27, 2026 at 08:17 |
Simply remove \e[48;5;X, because it is an unknown escape sequence, and it breaks your terminal
Enhancements:
Remove extra escape sequences that are not needed
There is no need to reset the formatting and then reset some part of the formatting, and you can reset and set the colors as a whole in one complete sequence
In your sample you can do just:
middeco=$'\n\e[38;5;231;48;5;214m' stopdeco=$'\e[0m'In your complete script you can do:
startdeco=$'\n\e[38;5;202m\e[38;5;231;48;5;202m' middeco=$'\e[38;5;202;48;5;208m\e[38;5;208;48;5;214m\e[38;5;231m' stopdeco=$'\e[0;38;5;214m\e[0m'

1 comment thread