Предел символов в командной строке Linux

27

Я передаю переменную в сценарий в командной строке. Каков предел символов команды? например:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Спасибо.

robdog
источник
1
Я не понимаю вопрос. Вас интересует лимит персонажей?
Крисси
Вы должны сформулировать свой вопрос более четко, иначе он просто закроется.
ThatGraemeGuy

Ответы:

27

Ограничение, накладываемое оболочкой / ОС, обычно очень велико - обычно один или двести тысяч символов.

getconf ARG_MAXдаст вам максимальный предел ввода для команды. В системе Debian у меня в настоящее время открыт терминал с возвратом 131072, что составляет 128 * 1024. Ограничение уменьшается вашими переменными среды, как будто моя память служит мне правильно, они передаются оболочкой в ​​той же структуре, хотя в большинстве случаев это займет всего несколько сотен символов. Чтобы найти аппроксимацию этого значения, запустите env | wc -c- это предлагает 325 символов в данный момент на этом входе в систему на этом компьютере.

Сценарии, вероятно, разрешают эту полную длину, но не исключено, что другие утилиты наложат свои собственные ограничения либо намеренно, либо из-за проблем проектирования. Также могут быть искусственные ограничения на длину отдельного аргумента в длинной командной строке и / или на длину пути к файлу.

Дэвид Спиллетт
источник
2
В моей системе getconf ARG_MAXвыдает 2097152, но максимальная длина аргумента, которую я могу передать, по-прежнему составляет 131071 (и мне не нужно вычитать размер среды).
Приостановлено до дальнейшего уведомления.
1
Также помните это xargsи даже find -execваши друзья, когда имеют дело с гигантскими списками аргументов.
coredump
@Dennis: значение, возвращаемое на getconfуровне ядра, я думаю. Возможно, bash устанавливает нижний предел своей конструкцией / конфигурацией? Кроме того, я знаю об этом некоторое время назад, так что может случиться так, что в последнее время все немного изменилось, хотя это не та область, в которой я ожидаю увидеть много движения, за исключением новых экспериментальных оболочек.
Дэвид Спиллетт
Я получаю те же результаты ksh, zsh, dash, fishи Bash 3 , как я сделал в Bash 4. Сообщение об ошибке fishможет быть информативным: «рыба: Общий размер аргумента и окружения списков (130Kb) превышает предельное значение операционной системы в 2.0MB «. Тем не менее, set | wc -cэто 306317 и env | wc -c2507, которые не учитывают разницу. Я не знаю, что еще считается.
Приостановлено до дальнейшего уведомления.
11

ARG_MAX действительно ограничивает общий размер командной строки и среды, но вы сталкиваетесь с дополнительным ограничением: один аргумент не должен быть длиннее, чем MAX_ARG_STRLEN (который, к сожалению, жестко задан как 131072).

См. Https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument

Rotsor
источник
1

Вы имеете в виду, какая самая длинная переменная длина? Чтобы понять это, вы можете использовать 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
Davey
источник
2
На самом деле это очень длинное значение переменной .
Приостановлено до дальнейшего уведомления.
3
Также вам не нужно использовать perlи скрипт:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Приостановлен до дальнейшего уведомления.
@DennisWilliamson, однако, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullработает.
Ярно
Это потому, что printfвстроенная оболочка, поэтому bashне нужно делать exec()для порождения другого процесса. ARG_MAXтолько имеет значение для длины списка аргументов из execфункций ( exec(), execl(), execlp(), execvp(), execvpe()и т.д.).
Висенте Оливер Риера