Я передаю переменную в сценарий в командной строке. Каков предел символов команды? например:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Спасибо.
linux
command-line-interface
robdog
источник
источник
Ответы:
Ограничение, накладываемое оболочкой / ОС, обычно очень велико - обычно один или двести тысяч символов.
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).
См. Https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument
источник
Вы имеете в виду, какая самая длинная переменная длина? Чтобы понять это, вы можете использовать perl "x" для создания очень длинного имени переменной:
На моей системе 131071 работает:
и переменная печатается на 131072, она слишком большая:
источник
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()
и т.д.).