Командная строка Bash и ограничение ввода


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

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

3 61

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 для получения строки в интерактивной оболочке

изменить вашу читать для чтения -электронные и раздражает строке ввода вешать уходит.