Я передаю переменную в сценарий в командной строке. Каков предел символов команды? например:
$ 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 -c2507, которые не учитывают разницу. Я не знаю, что еще считается.
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()и т.д.).