Ubuntu – Echo command with color option in script and command works differently

bashcommand linescripts

If I run echo -e "\e[1;31mThis is red text\e[0m" in comand line, It prints out red text.

However, if I use write it in script file test.sh

#! /bin/bash
echo -e "\e[1;31mThis is red text\e[0m"

run $ sh test.sh

It prints out
-e \e[1;31mThis is red text\e[0m

Why they act differntly?

Best Answer

echo is a shell builtin in Bash and dash (/bin/sh). If you run echo from the command line you are using the Bash builtin, if you are running your shell script with sh you are using the Dash builtin.

The dash version of echo doesn't know the -e option but just outputs anything verbatim without any special handling for \ sequences.

Either use Bash to run your shell script, or use /bin/echo instead of echo:

/bin/echo -e "\e[1;31mThis is red text\e[0m"

To avoid the problems with different versions of echo you may want to use printf instead. In contrast to echo printf always interprets \ sequences but doesn't automatically add a linefeed at the end so you have to append \n at the end if you want one.

As some versions of printf don't understand \e you should use \033 instead:

printf "\033[1;31mThis is red text\033[0m\n"