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

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

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

72 голоса | спросил Derek Halden 14 +04002013-10-14T10:52:14+04:00312013bEurope/MoscowMon, 14 Oct 2013 10:52:14 +0400 2013, 10:52:14

3 ответа


0

Ограничение длины командной строки накладывается не оболочкой, а операционной системой. Этот предел обычно находится в диапазоне сотен килобайт. POSIX обозначает этот предел ARG_MAX, а в системах, соответствующих POSIX, вы можете запросить его с помощью

$ getconf ARG_MAX    # Get argument limit in bytes

например. в Cygwin это 32000, а в разных системах BSD и Linux я использую его в диапазоне от 131072 до 2621440.

Если вам нужно обработать список файлов, превышающий этот предел, вы можете обратиться к утилите xargs, которая вызывает несколько раз программировать с подмножеством аргументов, не превышающим ARG_MAX.

Чтобы ответить на ваш конкретный вопрос, да, можно попытаться запустить команду со слишком длинным списком аргументов. Оболочка выдаст сообщение об ошибке «список аргументов слишком длинный».

Обратите внимание, что ввод для программы (как прочитано в stdin или любом другом файловом дескрипторе) не ограничен (только доступными программными ресурсами). Поэтому, если ваш сценарий оболочки считывает строку в переменную, вы не ограничены ARG_MAX.

ответил Jens 14 +04002013-10-14T11:30:04+04:00312013bEurope/MoscowMon, 14 Oct 2013 11:30:04 +0400 2013, 11:30:04
0

Хорошо, Денизенс. Таким образом, я уже давно принимаю ограничения длины командной строки как евангелие. Итак, что делать со своими предположениями? Естественно - проверь их.

У меня есть машина 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 работает так, как объявлено: с ошибкой у исполнителя больше ARG_MAX символы в списке аргументов, включая, следует отметить, данные среды.

ответил Mike S 10 22015vEurope/Moscow11bEurope/MoscowTue, 10 Nov 2015 01:13:25 +0300 2015, 01:13:25
0

Существует ограничение буфера, например, 1024. Чтение будет просто зависать в середине вставки или ввода. Чтобы решить эту проблему, используйте параметр -e.

http://linuxcommand.org/lc3_man_pages/readh.html

-e используйте Readline для получения строки в интерактивной оболочке

Измените ваше чтение на read -e, и раздражающее зависание ввода строки исчезнет.

ответил Paul Kenjora 11 J000000Wednesday18 2018, 01:21:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132