可以将输入流的前导字节复制到另一个文件而不关闭输入流吗?

时间:2012-03-05 18:30:45

标签: bash stdin head

我基本上问为什么:

head -c 2 > /tmp/first-two-bytes
cat /tmp/first-two-bytes -

不会将stdin的前两个字节复制到/tmp/first-two-bytes,然后将stdin的全部内容转储到stout。

[编辑]为了清楚起见,这是我机器上发生的事情:

$ uname -a
Darwin Myles-Byrnes-iMac.local 11.3.0 Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
$ echo "hello, world" | (head -c 2 > /tmp/first-two-bytes; cat /tmp/first-two-bytes -)
he$ cat /tmp/first-two-bytes 
he$

4 个答案:

答案 0 :(得分:1)

流中的每个字节只能读取一次。完全有可能实现头部只读取2个字节,但也可以实现头部读取整个流并仅输出前2个字节。如果使用后一种实现,那么在cat看到任何数据之前,stdout将会耗尽。

如果您希望head的功能可以保证从输入流中精确读取2个字节的数据并且最大程度地可移植,那么您可能希望使用dd。只需将head -c 2替换为dd bs=2 count=1

即可

答案 1 :(得分:1)

您的命令完全符合他们的要求。请记住,流不是文件。无论从流中读取什么,都会从中删除。没有倒带(除非你自己使用应用程序中的缓冲区实现它 - 但它将在应用程序中,而不是流的属性)。第一个命令从stdin读取2个字节。另一个从/ tmp输出文件和“stdin的全部内容” - 但是在调用它时,stdin的“全部内容”已经比上一个命令执行前少了两个字节。

答案 2 :(得分:1)

从以下命令可以看出,行为正如您所描述的那样:

$ echo "hello, world" | (head -c 2 > /tmp/first-two-bytes; cat /tmp/first-two-bytes -)
hello, world
$ cat /tmp/first-two-bytes
he$

请注意,最后一个$是提示

答案 3 :(得分:1)

如果我理解正确,你只想将标准输入的前两个字节写入一个特殊文件,然后将整个输入(包括前两个字节)打印到标准输出。

我是这样做的:

while read -r -n2 c2; do
    if [ ! -f tmp.txt ]; then
        echo $c2 > tmp.txt
    fi
    echo $c2
done < input.txt

基本上你首先将输入读入变量,一次读取两个字节,然后只写入前两个字节。

相关问题