如何防止命令替换删除 NUL 和尾随换行符?

如何防止命令替换删除 NUL 和尾随换行符?

Stackoverflow 的答案表示命令替换会删除 NUL 和尾随换行符,并提供以下命令来防止它这样做,

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"

cat "$FILE"不删除 NUL 或尾随换行符。可以代替吗

S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") 

这样建议的命令可以简化为

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
cat "$FILE" | od -tx1
rm "$FILE"

答案1

链接问题的重要之处在于标题:“如何读取文件到一个变量中在 shell 中?”答案是不能,在 Bash 中不行,因为 Bash 无法处理 NUL 字节。

这可以通过对文件进行编码来解决,以便文字 NUL 以其他方式表示。这可能是 Base64 编码(就像uuencode -m以前那样),或者 URL 编码,或者其他什么。这就是答案的作用,它使用uuencode不带 NUL 的“更好”字符串对文件进行编码,然后将其存储在变量 中S。 (普通格式S=$(cat file)不起作用,它会尝试以 NUL 字节等原样存储文件。)还显示了解码文件的相反操作。

通常,没有太大必要,人们应该尽量避免这样做。通过将文件保留为文件并根据需要使用外部工具处理它们,可以更轻松地处理文件。但问题具体是关于如何在 shell 变量中存储文件(任意文件)。从理论上讲,这可能有一些用处。或许。


尽管在您的情况下,如果您只想打印一些固定字符串,那么printf "a\0\n" > $filename或类似的工作就可以了,因为任何字节都可以用转义符表示。\NNN

相关内容