почему df получает результат, несовместимый с lsblk?

Этот вопрос был задан в списке рассылки Bash, и сопровождающий подтвердил, что это ошибка.

Они также упомянули, что текст в POSIX «не обязательно неоднозначен. , но это требует внимательного чтения ", поэтому я попросил разъяснений по этому поводу. Их ответ, включающий описание проблемы и интерпретацию стандарта , был следующим:

Подстановка команд - отвлекающий маневр; это актуально только потому, что указывало, где была ошибка.

Разделитель здесь-документа заключен в кавычки, поэтому строки не расширяются. В этом случае оболочка считывает строки из ввода, как если бы они были заключены в кавычки. Если обратная косая черта появляется в контексте, где она цитируется, она не действует как escape-символ (см. Ниже), и специальная обработка обратной косой черты-новой строки не выполняется. Фактически, если какая-либо часть разделителя заключена в кавычки, строки здесь-документа читаются, как если бы они были заключены в одинарные кавычки.

Текст в Posix 2.2.1 написан неуклюже, но это означает, что обратная косая черта обрабатывается особым образом только тогда, когда она не цитируется. Вы можете заключить в кавычки обратную косую черту и запретить все раскрытия только одинарными кавычками или другой обратной косой чертой.

Внимательное чтение - это «неразвернутый» текст, подразумевающий одинарные кавычки. Стандарт говорит в 2.2, что здесь документы являются «другой формой цитирования», но единственная форма цитирования, в которой слова вообще не раскрываются, - это одинарные кавычки. Таким образом, это форма цитирования, которая примерно такая же, как одинарные кавычки, но не одинарные кавычки.

2
11.01.2017, 03:53
3 ответа

На самом деле есть две проблемы. Первый из них очевиден, на что указали другие: lsblk перечисляет диски по устройствам, а df работает с смонтированными файловыми системами. Итак, lsblk / dev / sda3 примерно эквивалентен df -h / в вашем случае, поскольку / dev / sda3 установлен на /.

За исключением того, что это не так. Поскольку lsblk перечисляет размер раздела, а df перечисляет размер файловой системы. Разница (93,1 ГБ против 92 ГБ для sda3 в вашем примере) заключается в сочетании неиспользуемого пространства (если есть) и накладных расходов на файловую систему. Некоторое количество места необходимо для отслеживания самой файловой системы, а не содержимого файлов, которые она хранит.

5
27.01.2020, 21:51

Разделы / dev / sda4 и т. Д. Не монтируются. Поскольку они не смонтированы, df сообщает размер файловой системы, в которой находятся сами специальные файлы / dev / sda4 и т. Д .; это небольшая файловая система, основанная на памяти, смонтированная на / dev . Используйте sudo file -s / dev / sda4 и т. Д., Чтобы узнать, какие файловые системы, если таковые имеются, присутствуют на этих разделах. Смонтируйте их где-нибудь, если вы хотите использовать df , чтобы узнать, сколько места используется или доступно.

Пример:

$ df /dev/sdb1            # /dev/sdb1 is not currently mounted
Filesystem     1K-blocks  Used Available Use% Mounted on
udev              234040     0    234040   0% /dev

$ sudo mount /dev/sdb1 /mnt
$ df /dev/sdb1             # Now it is mounted and df can show used and free space
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/sdb1       60787696 498464  60289232   1% /mnt
2
27.01.2020, 21:51

Это потому, что df показывает информацию только о смонтированных файловых системах. sda1 и sda3 смонтированы, поэтому они показывают правильную информацию.

1
27.01.2020, 21:51

Теги

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