我正在用我自己的脚本传输一些 Unix 命令。问题是在我的脚本中,我使用了颜色。例如:
yellow=`tput setaf 3`
reset=`tput sgr0`
function Warning()
{
echo "${yellow}$*${reset}"
}
我有一个命令可以使用Warning "Compress $directory"
.
我想将它输入到 find 命令中。
我在用着:
./compress.sh | grep Push | awk '{print $2}' | while read directory; do find $directory | wc -l; done;
但是,我收到此错误:
find: '/some_directory\033(B\033[m': 没有这样的文件或目录 0
看起来要么是awk
在打印的末尾添加了一些看不见的字符,要么是颜色与滚边混淆了。
为什么我会收到此错误?我应该怎么办?
答案1
终端颜色通过转义序列起作用。${yellow}
确实是\033[0;33m
(或\e[0;33m
)并且${reset}
是\033[0m
。你可以尝试一下echo -e '\e[0;33m yellow \e[0m'
(基本颜色代码列表)。
\033
表示八进制数 033 的字符,即 ASCII 和 Unicode 中的 Escape。\e
是逃脱的另一种方式。标记[
代码的开始,m
标记代码的结束。
大多数程序无法解释颜色代码,因此如果您正在使用管道,则必须禁用它们。你可以检测你的程序是否在管道中运行,当[[ -t 1 ]]
为真时,您正在向终端写入内容,如果为假,则您正在向其他地方写入内容,可能是管道。
当您打印到终端时,这只会输出颜色:
yellow=''
reset=''
if [[ -t 1 ]]; then
yellow=`tput setaf 3`
reset=`tput sgr0`
fi
function Warning()
{
echo "${yellow}$*${reset}"
}