1

В bash есть понятие, называемое процессом замещения. Вы можете запустить команду и использовать вывод в виде файла.

например

$ cat -n <(seq 3|tac)
     1  3
     2  2
     3  1

Мне любопытно, почему следующее не удается;

$ du -sk <(xzcat /var/log/mpd/scribble.log.xz )
0   /dev/fd/63

Точно так же у нас есть это

$ file <(seq 1 2)
/dev/fd/63: broken symbolic link to pipe:[32560687]

Файл не пустой.

$ xzcat /var/log/mpd/scribble.log.xz  | wc -c 
16877047

>/dev/null  pv  <(xzcat /var/log/mpd/scribble.log.xz ) 
16.1MiB 0:00:00 [ 232MiB/s] [  <=>                   ]

В качестве дополнительного вопроса, знаете ли вы технику в bash, чтобы за короткое время маскировать fifo как обычные файлы?

1 ответ1

1

Обычные файлы состоят из трех основных компонентов:

  1. Имя (жесткая ссылка)
  2. Inode (системная информация)
  3. Тело (данные)

Трубы (неважно названные или анонимные, постоянные или временные) не имеют тела. Поэтому они всегда имеют нулевой размер в отличие от обычных файлов. У них есть только буфер в памяти. Вот почему анонимный именованный канал /dev /fd /63 имеет нулевую длину. Вы можете использовать любую другую команду внутри оператора <(...) с тем же результатом, скажем,

du -sk <(cat somefile)

Вы можете создать именованный канал с помощью команды mkfifo, чтобы увидеть, что его размер всегда равен нулю, даже если вы полностью заполните его буфер. На самом деле, размер файла именованных (и любых других) каналов не имеет реального смысла и устанавливается равным нулю для равномерности листинга среди других файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .