Я передаю переменную в сценарий в командной строке. Каков предел символов команды? например:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Спасибо.
Я передаю переменную в сценарий в командной строке. Каков предел символов команды? например:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Спасибо.
Ответы:
Ограничение, накладываемое оболочкой / ОС, обычно очень велико - обычно один или двести тысяч символов.
getconf ARG_MAX
даст вам максимальный предел ввода для команды. В системе Debian у меня в настоящее время открыт терминал с возвратом 131072, что составляет 128 * 1024. Ограничение уменьшается вашими переменными среды, как будто моя память служит мне правильно, они передаются оболочкой в той же структуре, хотя в большинстве случаев это займет всего несколько сотен символов. Чтобы найти аппроксимацию этого значения, запустите env | wc -c
- это предлагает 325 символов в данный момент на этом входе в систему на этом компьютере.
Сценарии, вероятно, разрешают эту полную длину, но не исключено, что другие утилиты наложат свои собственные ограничения либо намеренно, либо из-за проблем проектирования. Также могут быть искусственные ограничения на длину отдельного аргумента в длинной командной строке и / или на длину пути к файлу.
getconf ARG_MAX
выдает 2097152, но максимальная длина аргумента, которую я могу передать, по-прежнему составляет 131071 (и мне не нужно вычитать размер среды).
xargs
и даже find -exec
ваши друзья, когда имеют дело с гигантскими списками аргументов.
getconf
уровне ядра, я думаю. Возможно, bash устанавливает нижний предел своей конструкцией / конфигурацией? Кроме того, я знаю об этом некоторое время назад, так что может случиться так, что в последнее время все немного изменилось, хотя это не та область, в которой я ожидаю увидеть много движения, за исключением новых экспериментальных оболочек.
ksh
, zsh
, dash
, fish
и Bash 3 , как я сделал в Bash 4. Сообщение об ошибке fish
может быть информативным: «рыба: Общий размер аргумента и окружения списков (130Kb) превышает предельное значение операционной системы в 2.0MB «. Тем не менее, set | wc -c
это 306317 и env | wc -c
2507, которые не учитывают разницу. Я не знаю, что еще считается.
ARG_MAX действительно ограничивает общий размер командной строки и среды, но вы сталкиваетесь с дополнительным ограничением: один аргумент не должен быть длиннее, чем MAX_ARG_STRLEN (который, к сожалению, жестко задан как 131072).
Вы имеете в виду, какая самая длинная переменная длина? Чтобы понять это, вы можете использовать perl "x" для создания очень длинного имени переменной:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
На моей системе 131071 работает:
и переменная печатается на 131072, она слишком большая:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
perl
и скрипт:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
работает.
printf
встроенная оболочка, поэтому bash
не нужно делать exec()
для порождения другого процесса. ARG_MAX
только имеет значение для длины списка аргументов из exec
функций ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
и т.д.).