Зачем использовать «</ dev / null» с такой программой, как «bzip2»? - PullRequest
0 голосов
/ 15 января 2020

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

Я видел этот код в книге LFS, какова цель < /dev/null там? Я знаю, < /dev/null используется, чтобы не дать программам ожидать ввода, отправляя нули, но нужно ли это здесь?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Да, это необходимо.

Начиная с текущей версии 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 он просто зависнет, ожидая данных на stdin. < /dev/null предотвращает это, представляя файл нулевой длины, который он может сжать вместо этого. (Это добавляет некоторый двоичный мусор в конец вывода, но он фильтруется head, так что это не имеет значения).

Debian (и его нисходящие потоки, такие как Ubuntu) исправит это , что делает < /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 не выигрывает от каких-либо патчей, определяемых дистрибутивом c.

1 голос
/ 15 января 2020

Фраза < /dev/null это stdin для bzip2. Вполне возможно, что раньше или требовалось просто хорошая практика для учета каждого стандартного потока, и автор достаточно взрослый, чтобы все еще делать это. Три стандартных потока: stdin, stdout и stderr, и все они используются здесь.

Лично я бы сделал bzip2 --version 2>&1 | head -n1 | cut -d" " -f1,7-, поскольку bzip2 --version не потерпит неудачу, пропустив stdin.

Это может просто потребоваться для LFS. Это не требуется для Ubuntu.

...