Командная строка Bash и ограничение ввода
есть ли какой-то предел символов, наложенный в bash (или других оболочках), как долго может быть вход? Если да, то каков этот предел символов?
т. е. Можно ли написать команду в bash, которая слишком длинна для выполнения командной строки? Если нет требуемого предела, есть ли предлагаемый предел?
3 ответа:
ограничение длины командной строки устанавливается не оболочкой, а операционной системой. Этот предел обычно находится в пределах ста килобайт. POSIX обозначает этот предел
ARG_MAXи на POSIX-совместимых системах вы можете запросить его с помощью$ getconf ARG_MAX # Get argument limit in bytesнапример, на Cygwin это 32000, а на разных системах BSD и Linux я использую его где угодно от 131072 до 2621440.
Если вам нужно обработать список файлов, превышающих это ограничение, вы можете захотеть посмотрите на
xargsутилита, которая многократно вызывает программу с подмножеством аргументов, не превышающимARG_MAX.чтобы ответить на ваш конкретный вопрос, да, можно попытаться выполнить команду слишком длинный список аргументов. Оболочка будет ошибка с сообщением вдоль "список аргументов слишком долго".
отметим, что input для программы (как читается на stdin или любом другом файловом дескрипторе) это не ограничено (только по доступной программе ресурсы.) Поэтому, если ваш сценарий оболочки читает строку в переменную, вы не ограничены
ARG_MAX.
ОК, Обитатели. Поэтому я принял ограничения длины командной строки как Евангелие в течение довольно долгого времени. Итак, что же делать со своими предположениями? Естественно-проверьте их.
у меня есть машина Fedora 22 в моем распоряжении (что означает: Linux с bash4). Я создал каталог с 500 000 объектов (файлов) в каждом из 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ограничения. Таким образом, это объясняет, почему встроенные оболочки не ограниченыARG_MAX.и действительно, я могу
lsмой каталог, если мой список аргументов составляет 109948 файлов длиной, или около 2,089 000 символов (плюс-минус). Как только я добавлю еще один 18-символьный файл имени файла, хотя, то я получаю список аргументов слишком длинный ошибка. Так чтоARG_MAXработает как объявлено: exec терпит неудачу с более чемARG_MAXсимволы в списке аргументов-включая, следует отметить, данные среды.
существует предел буфера что-то вроде 1024. Чтение будет просто висеть в середине вставки или ввода. Для решения этой проблемы используйте опцию-e.
http://linuxcommand.org/lc3_man_pages/readh.html
-e используйте Readline для получения строки в интерактивной оболочке
изменить вашу читать для чтения -электронные и раздражает строке ввода вешать уходит.