Этот вопрос был задан в списке рассылки Bash, и сопровождающий подтвердил, что это ошибка.
Они также упомянули, что текст в POSIX «не обязательно неоднозначен. , но это требует внимательного чтения ", поэтому я попросил разъяснений по этому поводу. Их ответ, включающий описание проблемы и интерпретацию стандарта , был следующим:
Подстановка команд - отвлекающий маневр; это актуально только потому, что указывало, где была ошибка.
Разделитель здесь-документа заключен в кавычки, поэтому строки не расширяются. В этом случае оболочка считывает строки из ввода, как если бы они были заключены в кавычки. Если обратная косая черта появляется в контексте, где она цитируется, она не действует как escape-символ (см. Ниже), и специальная обработка обратной косой черты-новой строки не выполняется. Фактически, если какая-либо часть разделителя заключена в кавычки, строки здесь-документа читаются, как если бы они были заключены в одинарные кавычки.
Текст в Posix 2.2.1 написан неуклюже, но это означает, что обратная косая черта обрабатывается особым образом только тогда, когда она не цитируется. Вы можете заключить в кавычки обратную косую черту и запретить все раскрытия только одинарными кавычками или другой обратной косой чертой.
Внимательное чтение - это «неразвернутый» текст, подразумевающий одинарные кавычки. Стандарт говорит в 2.2, что здесь документы являются «другой формой цитирования», но единственная форма цитирования, в которой слова вообще не раскрываются, - это одинарные кавычки. Таким образом, это форма цитирования, которая примерно такая же, как одинарные кавычки, но не одинарные кавычки.
На самом деле есть две проблемы. Первый из них очевиден, на что указали другие: lsblk перечисляет диски по устройствам, а df работает с смонтированными файловыми системами. Итак, lsblk / dev / sda3
примерно эквивалентен df -h /
в вашем случае, поскольку / dev / sda3 установлен на /.
За исключением того, что это не так. Поскольку lsblk
перечисляет размер раздела, а df
перечисляет размер файловой системы. Разница (93,1 ГБ против 92 ГБ для sda3 в вашем примере) заключается в сочетании неиспользуемого пространства (если есть) и накладных расходов на файловую систему. Некоторое количество места необходимо для отслеживания самой файловой системы, а не содержимого файлов, которые она хранит.
Разделы / 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
Это потому, что df показывает информацию только о смонтированных файловых системах. sda1 и sda3 смонтированы, поэтому они показывают правильную информацию.