Ограничение строки встроенной оболочки `printf`?

В принципе, золотое правило разработки ядра гласит: "Никогда не ломай пользовательское пространство". Таким образом, вы можете обновить ядро, и все приложения должны работать. Но на практике должен не всегда равен делает. Особенно это касается древних версий ядра; я не могу вспомнить ни одного реального разрушительного изменения со времен серии 2.4.

Главное, что обычно не будет работать - это любой сторонний модуль ядра. В отличие от интерфейсов ядро-пользователь, интерфейсы ядро-ядро, которые используют модули, могут и часто меняются от версии к версии, причем не только на бинарном уровне, но и на уровне исходных текстов. Если у вас есть сторонние модули ядра и вы обновляете ядро, вам может понадобиться получить соответствующие версии модулей ядра, если они существуют.

Хотя приложения для конечных пользователей обычно безопасны, некоторые инструменты администрирования или аппаратного обеспечения зависят от интерфейсов ядра, которые объявлены нестабильными. В частности, организация файлов в /sys изменилась за время его существования, и не все программы обращаются к нему через интерфейсы, которые остались стабильными. Интерфейсы /proc более стабильны, но и там в прошлом происходили изменения; например, интерфейсы брандмауэра изменились обратно несовместимым образом в версии 2.2 (ipfwadmipchains) и снова в версии 2.4 (ipchainsiptables) (но не с тех пор).

Еще одна вещь, которая может измениться - это именование записей по умолчанию в /dev (например, потому что некоторые дисковые драйверы изменили hd? на sd?). Этого можно избежать или замаскировать с помощью udev.

6
20.05.2019, 23:44
2 ответа

The /usr/bin/printf util argument list length is limited to the shell's maximum command line length, (i.e. getconf ARG_MAX, on my system that'd be 2097152); example:

Это не ограничение оболочки , а ограничение ОС (ядра Linux ), особенно его execve(2)системного вызова, и вызвано устаревшим способом, которым аргументы командной строки и переменные среды передаются запущенной программе.

(Обратите внимание, что это ограничение также включает переменные окружения! ).

A skim of man bash dash doesn't seem to say much about this advantage of builtin printf. Where is it documented? Do builtin printfs have an argument list length, (e.g. bash), and if so, what is it?

Поскольку встроенные в оболочку -ins не проходят через execve(2), у них нет такого ограничения. Современная оболочка обычно не использует буферы фиксированного размера и тому подобное, поэтому ограничение обычно накладывается объемом доступной памяти и расположением виртуального адресного пространства --, т.е. оно не ограничено для всех намерений и целей.

2
27.01.2020, 20:21

Стандарт POSIX требует, чтобы оболочка была реализована без ограничения строки.

Итак, это естественность, которую оболочки не документируют.

Кстати, :из-за этого сценарий оболочки не может быть текстовым файлом, поскольку текстовый файл — это файл, в котором нет строк длиннее LINE _MAX ;-)

0
27.01.2020, 20:21

Теги

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