Ограничение длины командной строки: встроенный vs executable

Таким образом, для спецификации POSIX мы имеем следующее определение для * :

Расширяется до позиционных параметров, начиная с одного, изначально создавая одно поле для каждого установленного параметра позиционирования. Когда расширение происходит в контексте, где будет выполняться разделение поля, любые пустые поля могут быть отброшены, и каждое из непустых полей должно быть дополнительно разделено, как описано в разделе «Разделение поля». Когда расширение происходит в контексте, когда разделение поля не будет выполняться, начальные поля должны быть объединены, чтобы сформировать одно поле со значением каждого параметра, разделенным первым символом переменной IFS, если IFS содержит хотя бы один символ или разделенных символом if, если IFS не задано, или без разделения, если IFS установлено в пустую строку.

Для подавляющего большинства людей мы знаем о знаменитом ограничении ARG_MAX :

 $ getconf ARG_MAX 2621440 

что может привести к:

 $ cat * | sort -u > /tmp/bla.txt -bash: /bin/cat: Argument list too long 

К счастью, хорошие люди, стоящие за bash ([включая все POSIX-подобные другие]), предоставили нам printf как встроенный, поэтому мы можем просто:

 printf '%s\0' * | sort -u --files0-from=- > /tmp/bla.txt 

И все прозрачно для пользователя.

Может кто-нибудь, пожалуйста, сообщите мне, почему это так тривиально, чтобы обойти ограничение ARG_MAX с помощью built-in команды и почему так чертовски сложно предоставить соответствующий интерпретатор интерпретатора POSIX, который обрабатывал бы изящно * специальный параметр для автономного исполняемого файла:

 $ cat * 

Это что-то сломает? Я не прошу людей bash предоставить cat в качестве встроенного, меня интересует только порядок операций и почему * расширяется по-разному, зависит от того, является ли команда встроенной или является автономным исполняемым файлом.

  • эквивалентно «cpusets» для gpu's
  • 2 Solutions collect form web for “Ограничение длины командной строки: встроенный vs executable”

    Ограничение не в оболочке, а в семействе функций exec() .

    Стандарт POSIX говорит по этому поводу :

    Количество байтов, доступных для комбинированных списков аргументов и окружения нового процесса, – {ARG_MAX} . Определяется реализация: включены ли в этот итог нулевые терминаторы, указатели и / или любые байты выравнивания.

    Чтобы запустить утилиты, встроенные в оболочку, оболочке не нужно будет вызывать exec() , поэтому это ограничение не изменяется.

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

    Также обратите внимание, что printf не является встроенной утилитой, например pdksh (которая действует как sh и ksh на OpenBSD). Опираясь на это, будучи встроенным, нужно будет использовать конкретную оболочку, которая будет использоваться во внимание.

    Ответ Кусалананды объясняет, почему ARG_MAX не является проблемой для встроенных оболочек.

    Что касается реализации cat * таким образом, что ARG_MAX не затрагивается, выполнение этого тривиально: все, что нужно реализовать cat , это использовать glob(3) для реализации своего собственного globbing, а затем вы запустите его, используя cat \* или cat '*' чтобы оболочка не делала свое собственное подталкивание. Вы найдете несколько команд в системе Linux или Unix, которые могут позаботиться о своем собственном подтасовке, по крайней мере, в определенных обстоятельствах; find , tar , zip и т. д. Многие команды с родными версиями DOS, по крайней мере, включают в себя код для обработки globbing, так как оболочки там не глобуют сами внешние аргументы команд.

    Учитывая ожидания оболочки POSIX, эта функция будет довольно удивительной и труднодоступной! В ранних версиях Unix функция globbing была реализована с использованием отдельной программы /etc/glob .

    Interesting Posts

    Миграция Centos 6 в Fedora 25

    подсчет количества строк с определенным текстом и извлечение строк из положительных результатов

    Как пользователи монтируют .bin / .cue или .iso с устройством loopback как только для чтения?

    Поддержка SDcard в Linux для устройства чтения карт памяти ENE Flash UB6250 (найдено на Acer Aspire One 522)

    Xfce 4.12: Как настроить диалоговое окно переключателя окон (Alt-Tab) для использования режима списка?

    Создайте две последовательности чисел, разделенные символом "|"

    Не удается запустить мой скрипт

    Как правильно настроить анонимную NFS

    Динамически изменять / etc / hosts

    Как понизить CentOS 7.2 до 7.1 на Linode?

    Как я могу объяснить, почему процесс ждет?

    как прикасаться к файлам, таким как report-07/05/13

    Можно ли показывать текущий номер строки истории при выполнении обратного поиска в bash?

    Соединение WIFI с Live CD, но не с установленной ОС

    Обновление заголовка терминала в ловушке отладки ломает расцветку

    Linux и Unix - лучшая ОС в мире.