脚本中带有颜色选项的回显命令和命令的工作方式不同

qin*_*eng 16 command-line bash scripts

如果我echo -e "\e[1;31mThis is red text\e[0m"在命令行中运行,它会打印出红色文本。

但是,如果我使用将其写入脚本文件中 test.sh

#! /bin/bash
echo -e "\e[1;31mThis is red text\e[0m"
Run Code Online (Sandbox Code Playgroud)

$ sh test.sh

它打印出来 -e \e[1;31mThis is red text\e[0m

为什么他们的行为不同?

Flo*_*sch 30

echo是 Bash 和 dash ( /bin/sh) 中内置的 shell 。如果您从命令行运行echo,您使用的是 Bash 内置程序,如果sh您正在使用 Dash 内置程序运行您的 shell 脚本。

的破折号版本echo不知道-e选项,但只是逐字输出任何内容,而不对\序列进行任何特殊处理。

要么使用 Bash 运行你的 shell 脚本,要么使用/bin/echo代替echo

/bin/echo -e "\e[1;31mThis is red text\e[0m"
Run Code Online (Sandbox Code Playgroud)

为避免不同版本的问题,echo您可能需要printf改用。与echo printf始终解释\序列但不会在末尾自动添加换行符相反,\n如果需要,则必须在末尾附加。

由于某些版本printf不明白,\e您应该\033改用:

printf "\033[1;31mThis is red text\033[0m\n"
Run Code Online (Sandbox Code Playgroud)