Установка длинной переменной среды нарушает работу многих команд.

Установка длинной переменной среды нарушает работу многих команд.

Я наблюдаю странное поведение, когда путаюсь с переменными окружения. Я настраиваю очень длинную переменную окружения, и это мешает запуску любой команды:

( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )

$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long

Что здесь происходит ?

решение1

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

Это происходит как частьexecveсистемный вызов. Большинство, если не все варианты unix имеют ограничение на размер этого временного пространства. Причина этого ограничения в том, чтобы избежать ошибок или вредоносных программ, которые заставят ядро ​​использовать огромный объем памяти за пределами собственного пространства памяти этой программы.

Theстандарт POSIXуказывает, что максимальный размер этого пространства памяти должен быть не менее ARG_MAX, и чтоминимальное значениеиз этого ( _POSIX_ARG_MAX) составляет 4096. На практике большинство вариантов Unix допускают больше, но не 10 МБ. Вы можете проверить значение в вашей системе с помощью getconf ARG_MAX. В современных системах Linux максимум составляет 2 МБ (с типичными настройками). Традиционно во многих системах был предел в 128 КБ. Linux также все еще имеетОграничение в 128 КБ для значения одного аргумента или определения переменной среды.

Если вам необходимо передать более нескольких сотен байт информации, передайте ее в файле.

Связанный контент