带有特殊字符的Linux cat内联文件

时间:2017-11-06 15:20:29

标签: linux cat

我有以下脚本:

#!/bin/bash
cat << EOF
A^@B^AC^B
EOF

其中:

  • '^ @'=十进制值0
  • '^ A'=十进制值1
  • '^ B'=十进制值2

所以,文件看起来像这样:

xxd main.sh
00000000: 2321 2f62 696e 2f62 6173 680a 0a63 6174  #!/bin/bash..cat
00000010: 203c 3c20 454f 460a 4100 4201 4302 0a45   << EOF.A.B.C..E
00000020: 4f46 0a                                  OF.

当我运行脚本时,小数值0和1似乎消失了:

./main.sh | xxd
00000000: 4142 4302 0a                             ABC..

我的问题是为什么?我期待有这样的输出:

字符'A',后跟十进制值0,后跟'B',后跟十进制值1,后跟'C',后跟十进制值2.

2 个答案:

答案 0 :(得分:2)

原因似乎是双重的。

首先,请注意,您必须引用here-document 中的 /分隔符,以避免扩展

  

如果 word 不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,忽略字符序列\ newline,并且必须使用'\'引用字符'\','$'和'`'。

所以,如果你这样写:

#!/bin/bash
cat <<"EOF"
A^@B^AC^B
EOF

您将保留除NULL(\0)以外的所有字符。

但是你不能在任何变量或命令行的参数中使用NULL char(参见this answer)。

可以在管道/文件中使用 NULL,因此您可能希望对here-document的内容进行编码并在运行时对其进行解码(例如使用xxd)。< / p>

答案 1 :(得分:0)

在仔细考虑了这个问题后,我意识到引用单词/分隔符(正如另一个答案所建议的)不应该影响脚本的输出(参数扩展,命令替换和算术扩展都没有在我的执行中执行脚本)。

所以,\000确实消失了,因为你不能在任何变量或命令行的参数中使用NULL字符。

但是,由于bash bug,\001消失了。该值在bash内部用作转义字符。错误发生在函数expand_word_internal中,它无法正确处理该转义字符(请参阅错误报告here)。

该错误已在bash devel分支中修复。