Командная строка 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 для получения строки в интерактивной оболочке
изменить вашу читать для чтения -электронные и раздражает строке ввода вешать уходит.