Bash командная строка и предел ввода

Есть ли какой-либо характерный предел, введенный в bash (или другие оболочки), как долго может быть вход? Если да, то каков этот лимит символов?

т.е. Возможно ли написать команду в bash, которая слишком длинна для выполнения командной строки? Если нет требуемого предела, существует ли предлагаемый лимит?

Ответы

Ответ 1

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

$ getconf ARG_MAX    # Get argument limit in bytes

Например, на Cygwin это 32000, а на разных BSD и Linux-системах я использую его в диапазоне от 131072 до 2621440.

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

Чтобы ответить на ваш конкретный вопрос, да, можно попытаться запустить команду со слишком длинным списком аргументов. Оболочка выдаст сообщение об ошибке "список аргументов слишком длинный".

Обратите внимание, что входные данные для программы (как прочитано в stdin или любом другом файловом дескрипторе) не ограничены (только доступными программными ресурсами). Таким образом, если ваш скрипт оболочки читает строку в переменную, ARG_MAX не ограничивает вас. Ограничение также не распространяется на встроенные оболочки.

Ответ 2

Хорошо, Денизенс. Поэтому я довольно давно принял ограничения длины командной строки как евангелие. Итак, что делать с одним допущением? Естественно, проверьте их.

У меня есть машина Fedora 22 в моем распоряжении (что означает: Linux с bash4). Я создал каталог с 500 000 inodes (файлов), в котором каждый из 18 символов. Длина командной строки - 9 500 000 символов. Создано таким образом:

seq 1 500000 | while read digit; do
    touch $(printf "abigfilename%06d\n" $digit);
done

И мы отмечаем:

$ getconf ARG_MAX
2097152

Заметьте, что я могу это сделать:

$ echo * > /dev/null

Но это не удается:

$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long

Я могу запустить цикл for:

$ for f in *; do :; done

который является другой оболочкой.

Тщательное чтение документации для ARG_MAX: максимальная длина аргумента для функций exec. Это означает: без вызова exec ограничение ARG_MAX отсутствует. Так что это объясняет, почему shell builtins не ограничены ARG_MAX.

И действительно, я могу ls мой каталог, если мой список аргументов длится 109948 файлов или около 2 089 000 символов (дайте или возьмите). Однако, если я добавлю еще один файл с именами из 18 символов, я получаю слишком длинную ошибку в списке аргументов. Таким образом, ARG_MAX работает как рекламируемый: exec не работает с более чем ARG_MAX символами в списке аргументов, включая, как следует отметить, данные среды.

Ответ 3

Существует ограничение на буфер примерно равным 1024. Чтение будет просто зависать в середине пасты или ввода. Для решения этой проблемы используйте параметр -e.

http://linuxcommand.org/lc3_man_pages/readh.html

-e используют Readline для получения строки в интерактивной оболочке

Измените ваше чтение, чтобы прочитать -e, и раздражающая линейная вставка зависает.