Почему дю -ск не сообщает размер пятерки?

241
Ярослав Рахматуллин

В 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
Oleg Bolden

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

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

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

du -sk <(cat somefile)

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

Таким образом, * длина канала * равна содержимому буфера, которое может быть чем-то или ничем, и единственный способ узнать, есть ли у вас доступ к буферу? Ярослав Рахматуллин 6 лет назад 0
Я бы назвал это «вместимостью», а не «размером». Емкость FIFO обычно ограничена в 64 КБ, хотя максимальный размер буфера в современных системах Linux составляет 1 МБ (`cat / proc / sys / fs / pipe-max-size`). Всегда есть два партнера - читатель из fifo и писатель. И писатель, и читатель получают и получают информацию порциями, пока читатель не получит отметку EOF в потоке данных. В этот момент передача данных считается конкурирующей, и канал удаляется (если только он не называется каналом). Oleg Bolden 6 лет назад 0

Похожие вопросы