为什么要在 "bzip2" 这样的程序中使用“< /dev/null”?

Why Using "< /dev/null" with a program like "bzip2"?

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,7-

我在LFS书上看到这段代码,< /dev/null那里的目的是什么? 我知道 < /dev/null 用于通过发送零来防止程序等待输入,但是这里有必要吗?

短语 < /dev/null 是 bzip2 的 stdin。很可能,过去需要 只是一种很好的做法来说明每个标准流,而且作者已经足够大了,仍然可以这样做。三个标准流是 stdinstdoutstderr,所有都在这里使用。

我个人会做 bzip2 --version 2>&1 | head -n1 | cut -d" " -f1,7- 因为 bzip2 --version 不会因为缺少 stdin.

而失败

它可能只是 LFS 所需要的。 Ubuntu.

不需要

是的,这是必要的。

从当前版本 1.0.8 开始,bzip2 --version 将打印版本信息,但也会继续压缩 stdin:

$ ./bzip2 --version
bzip2, a block-sorting file compressor.  Version 1.0.8, 13-Jul-2019.

   Copyright (C) 1996-2019 by Julian Seward.

   This program is free software; [...]

bzip2: I won't write compressed data to a terminal.
bzip2: For help, type: `bzip2 --help'.

当另外通过 head 进行管道传输时,它只会挂起,等待标准输入上的数据。 < /dev/null 通过提供一个它可以压缩的零长度文件来防止这种情况。 (这确实在输出的末尾添加了一些二进制垃圾,但是它被 head 过滤掉了所以没关系)。

Debian(及其下游 Ubuntu)将 patch this out,使得 < /dev/null 变得不必要:

@@ -1916,8 +1918,8 @@ IntNative main ( IntNative argc, Char *a
       if (ISFLAG("--keep"))              keepInputFiles   = True;    else
       if (ISFLAG("--small"))             smallMode        = True;    else
       if (ISFLAG("--quiet"))             noisy            = False;   else
-      if (ISFLAG("--version"))           license();                  else
-      if (ISFLAG("--license"))           license();                  else
+      if (ISFLAG("--version"))           { license(); exit ( 0 ); }  else
+      if (ISFLAG("--license"))           { license(); exit ( 0 ); }  else
       if (ISFLAG("--exponential"))       workFactor = 1;             else
       if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
       if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else

但显然,Linux From Scratch 不会受益于任何特定于发行版的补丁。