0

这两个命令是不同$(git ls-files -s | wc -l)还是$(git ls-files -s >out && wc -l <out)相同,就像第一个以第二种形式编写时一样,我最终会出错。


必须保留从deflateflush方法返回的数据。

在这个特定的例子中,忽略从返回的数据deflate恰好起作用,因为输入很小。如果您将更大的缓冲区放入deflate中,而忽略它返回的内容,您将得到一个损坏的数据流。

这里有一点背景——默认情况下Compress::Zlib将创建一个符合RFC 1950的压缩数据流。gzinflate 查看此处的定义,看来此方法需要符合RFC 1951的数据流。

当返回的数据被忽略时,测试代码发生工作的原因flush归结为RFC 1950数据流只是一个RFC 1951数据流,具有两个字节的头部和四个字节的尾部。

下面的第一次调用deflate将只返回两个字节的标题,因为 $php_code只包含几个字节的数据

$buffer  = $d->deflate($php_code);

这意味着通过忽略从 返回的数据deflate,您最终会得到一个RFC 1951数据流,其中包含来自RFC 1950的预告片。phpgzinflate方法似乎可以解决这个问题。

如果输入数据较长,它将返回两个字节的标头一些压缩数据。

要获得Compress::Zlib以创建正确的数据流,请使用此

my $d = deflateInit(-WindowBits => MAX_WBITS) ;
$buffer  = $d->deflate($php_code);
$buffer .= $d->flush();
4

1 回答 1

3

当您将一个程序的输出通过管道传输到另一个程序的输入时,如下所示:

$(git ls-files -s | wc -l)

...程序同时运行。wc将在收到行数后立即开始计数。管道还将输出定向git到输入,wc而无需任何中间文件。

请注意,在这种情况下,wc即使git命令由于某种原因失败也会运行,因此您将获得wc输出(在大多数情况下,0)。

在您的第二个示例中:

$(git ls-files -s >out && wc -l <out)

...git命令首先运行,并将其结果存储在一个名为out. 然后,如果成功,wc则运行并计算行数。因为&&,如果git命令失败,wc则根本不会运行。无论哪种情况,您都会有一个名为outlayouts的文件,其中包含git命令的结果。

管道通常更好;它会运行得更快,如果你不需要保留中间结果,它不会有任何副作用。

于 2017-03-06T18:20:40.840 回答