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