在bash脚本中重定向输出时如何避免使用特殊字符

时间:2014-04-22 16:24:28

标签: bash

将输出从bash脚本重定向到文件时,我在文件中得到特殊字符。例如,

for file in *; do echo $file; done > output.txt

然后如果我cat output.txt

cat output.txt

我得到了

file1.txt
file2.txt
file3.txt
output.txt

但是在编辑文件时,我看到了:

^[[0m^[[0mfile1.txt
^[[0m^[[0mfile2.txt
^[[0m^[[0mfile3.txt
^[[0m^[[0moutput.txt

如何避免那些令人讨厌的角色?


解决方案:

我在.bashrc中有以下行:

trap 'echo -ne "\e[0m"' DEBUG

通过删除它,我解决了问题。

谢谢大家的帮助。

3 个答案:

答案 0 :(得分:5)

这些是ANSI转义码,用于格式化终端中的文本。而不是试图删除它们,你应该首先防止它们被写入。

您确定从您发布的确切代码中获得此信息吗?如果是这样,您的文件实际上会在您的名字中包含这些字符,您只需重命名它们即可。

更常见的方法是使用输出ANSI转义序列的工具。这是显示相同问题的可重现方式:

ls --color=always > file

如果您发布的代码是一个未经测试的示例,您应该查找负责ANSI代码的工具并使其停止(特别确定您没有循环输出ls。)

以下是您看到的问题的一个示例,其中touch代表某些进程/脚本意外创建了带有ANSI转义的文件名:

# Reproduce the problem
$ touch $'\x1B[0m\x1B[0mfile.txt'

# Symptoms of the problem
$ ls *.txt
?[0m?[0mfile.txt

$ for f in *.txt; do echo "$f"; done
file.txt

$ for f in *.txt; do echo "$f"; done | cat -v
^[[0m^[[0mfile.txt

# Fix the problem by renaming the bad files
$ crud=$'\x1B[0m'; for f in *"$crud"*; do mv "$f" "${f//$crud/}"; done

# Now works as expected
$ ls *.txt
file.txt

$ for f in *.txt; do echo "$f"; done
file.txt

$ for f in *.txt; do echo "$f"; done | cat -v
file.txt

答案 1 :(得分:0)

您可以使用ls -f选项(禁用颜色)来避免那些令人讨厌的字符,如下所示:

for file in $(ls -f *); do echo $file; done > output.txt

答案 2 :(得分:0)

运行raw ls命令

/ bin中/ LS

作为

/ bin / ls> your_file

您将避免输出文件your_file中的特殊字符。