这两个命令是不同$(git ls-files -s | wc -l)
还是$(git ls-files -s >out && wc -l <out)
相同,就像第一个以第二种形式编写时一样,我最终会出错。
linux - $(git ls-files -s | wc -l) 和 $(git ls-files -s >out && wc -l 之间的区别
这两个命令是不同$(git ls-files -s | wc -l)
还是$(git ls-files -s >out && wc -l <out)
相同,就像第一个以第二种形式编写时一样,我最终会出错。
<
问问题
447 次
您必须保留从deflate
和flush
方法返回的数据。
在这个特定的例子中,忽略从返回的数据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 回答
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
则根本不会运行。无论哪种情况,您都会有一个名为out
layouts的文件,其中包含git
命令的结果。
管道通常更好;它会运行得更快,如果你不需要保留中间结果,它不会有任何副作用。
于 2017-03-06T18:20:40.840 回答
这两个命令是不同$(git ls-files -s | wc -l)
还是$(git ls-files -s >out && wc -l <out)
相同,就像第一个以第二种形式编写时一样,我最终会出错。
您必须保留从deflate
和flush
方法返回的数据。
在这个特定的例子中,忽略从返回的数据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();
1 回答
当您将一个程序的输出通过管道传输到另一个程序的输入时,如下所示:
$(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
则根本不会运行。无论哪种情况,您都会有一个名为out
layouts的文件,其中包含git
命令的结果。
管道通常更好;它会运行得更快,如果你不需要保留中间结果,它不会有任何副作用。