【发布时间】:2020-08-03 00:12:03
【问题描述】:
我有一个程序打印包含空字节 \0 和特殊字符(如 \x1f 和换行符)的内容。例如:
someprogram
#!/bin/bash
printf "ALICE\0BOB\x1fCHARLIE\n"
给定这样一个程序,我想以这样一种方式读取它的输出,即所有这些特殊字符都被捕获在一个 shell 变量 output 中。所以,如果我运行:
echo $output
因为我没有提供 -e,所以我希望输出为:
ALICE\0BOB\x1fCHARLIE\n
如何做到这一点?
我的第一次尝试是:
output=$(someprogram)
但是我得到了这个没有特殊字符的回显输出:
./myscript.sh: line 2: warning: command substitution: ignored null byte in input
ALICEBOBCHARLIE
我也尝试使用read,如下:
output=""
while read -r
do
output="$output$REPLY"
done < <(someprogram)
然后我摆脱了警告,但输出仍然缺少所有特殊字符:
ALICEBOBCHARLIE
那么如何捕获someprogram 的输出,以便在结果字符串中包含所有特殊字符?
编辑:请注意,在 bash 中可以有这样的字符串:
$ x="ALICE\0BOB\x1fCHARLIE\n"
$ echo $x
ALICE\0BOB\x1fCHARLIE\n
所以这应该不是问题。
EDIT2:既然我得到了一个可接受的答案并且我对事情的理解更好一点,我将重新提出这个问题。所以,我只需要能够将someprogram 的输出存储在某个shell 变量中,这样我就可以将它打印到stdout,而无需对任何特殊字符进行任何更改,就好像someprogram 只是直接通过管道传输到stdout。
【问题讨论】:
-
"\0"只是两个字符,它 不是 一个零字节。我猜你想要:$'ALICE\x00BOB\x1fCHARLIE\n'
标签: bash special-characters stdout stdin