Есть ли какое-то ограничение на количество символов в bash (или других оболочках) на продолжительность ввода? Если да, то каков этот лимит символов?
Т.е. можно ли написать в bash команду, которая слишком длинна для выполнения из командной строки? Если необходимого ограничения нет, есть ли предлагаемый предел?
bash
shell
unix
command-line-arguments
Дерек Холден
источник
источник
Ответы:
Ограничение на длину командной строки устанавливается не оболочкой, а операционной системой. Этот предел обычно находится в диапазоне сотен килобайт. POSIX обозначает этот предел,
ARG_MAX
и в системах, совместимых с POSIX, вы можете запросить его с помощью$ getconf ARG_MAX # Get argument limit in bytes
Например, в Cygwin это 32000, а в различных системах BSD и Linux, которые я использую, это где-то от 131072 до 2621440.
Если вам нужно обработать список файлов, превышающих этот предел, вы можете посмотреть
xargs
утилиту, которая многократно вызывает программу с подмножеством аргументов, не превышающихARG_MAX
.Чтобы ответить на ваш конкретный вопрос, да, можно попытаться запустить команду со слишком длинным списком аргументов. Оболочка выдаст ошибку с сообщением «слишком длинный список аргументов».
Обратите внимание, что ввод в программу (при чтении на стандартном вводе или любом другом дескрипторе файла) не ограничен (только доступными ресурсами программы). Поэтому, если ваш сценарий оболочки считывает строку в переменную, вы не ограничены
ARG_MAX
. Ограничение также не распространяется на встроенные командные интерпретаторы.источник
cmd <<< "$LONG_VAR"
получу конструкцию и значение LONG_VAR превысит лимит, будет ли моя команда взорвана?LONG_VAR
передается по стандартному вводу - и это полностью выполняется в оболочке; он не раскрывается в качестве аргументаcmd
, поэтому ограничение ARG_MAX для fork () / exec () не применяется. Попробовать легко: создайте переменную с содержимым, превышающим ARG_MAX, и выполните свою команду.blah="$(cat /home/schwager/Music/Recordings/20090420\ 131623.m4a)"; cat <<< $blah >/dev/null
. Обратите внимание на отсутствие ошибок.xargs
на MacOS 10.12.6 пределах , сколько он пытается поставить в одинexec()
кARG_MAX - 4096
. Таким образом, использование сценариевxargs
может работать до тех пор, пока однажды кто-нибудь не поместит в среду слишком много вещей. Теперь столкнуться с этим (обойти это с помощью:)xargs -s ???
.Хорошо, жители. Так что я уже довольно давно принял ограничения на длину командной строки как евангелие. Итак, что делать со своими предположениями? Естественно - проверьте их.
В моем распоряжении есть машина с Fedora 22 (имеется в виду Linux с bash4). Я создал каталог с 500 000 инодов (файлов), каждый из которых имеет длину 18 символов. Длина командной строки составляет 9 500 000 символов. Создано таким образом:
seq 1 500000 | while read digit; do touch $(printf "abigfilename%06d\n" $digit); done
И отметим:
Обратите внимание, что я могу сделать это:
$ 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
символами в списке аргументов, включая, следует отметить, данные среды.источник
for f in *; do echo $f; done
не будет форкнуть (все встроенные функции). Так что я не знаю, будет ли комбинация find-xargs быстрее; это не было проверено. В самом деле, я не знаю, в чем состоит проблема OP. Может быть,find /path/to/directory
он ему не пригодится, потому что вернет путь к файлу. Может, ему нравится простотаfor f in *
петли. Тем не менее, разговор идет об ограничении линейного ввода, а не об эффективности. Итак, остановимся на теме, касающейся длины командной строки.Ограничение буфера составляет примерно 1024. Чтение просто зависнет в середине вставки или ввода. Чтобы решить эту проблему, используйте параметр -e.
http://linuxcommand.org/lc3_man_pages/readh.html
-e использовать Readline для получения строки в интерактивной оболочке
Измените чтение на read -e, и надоедливое зависание строки исчезнет.
источник
read
: «Т.е. можно ли написать в bash команду, которая слишком длинна для выполнения из командной строки?»bash --noediting
в новом приглашении попробуйте запустить командуecho somereallylongword
, где somereallylongword длиннее 4090 символов. При пробах на Ubuntu 18.04 слово было усечено, поэтому очевидно, что оно как-то связано с отключением Readline.