Почему дю -ск не сообщает размер пятерки?
В 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 для маскировки fifos в виде обычных файлов на короткое время?
1 ответ
Обычные файлы состоят из трех основных компонентов:
- Имя (жесткая ссылка)
- Inode (системная информация)
- Тело (данные)
Трубы (неважно названные или анонимные, постоянные или временные) не имеют тела. Поэтому они всегда имеют нулевой размер в отличие от обычных файлов. У них есть только буфер в памяти. Вот почему анонимный именованный канал /dev/fd/63 имеет нулевую длину. Вы можете использовать любую другую команду внутри оператора <(...) с таким же результатом, скажем,
du -sk <(cat somefile)
Вы можете создать именованный канал с помощью команды mkfifo, чтобы увидеть, что его размер всегда равен нулю, даже если вы полностью заполняете его буфер. На самом деле, размер файла именованных (и любых других) каналов не имеет реального смысла и устанавливается равным нулю для равномерности листинга среди других файлов.