Я наблюдаю странное поведение, когда путаюсь с переменными окружения. Я настраиваю очень длинную переменную окружения, и это мешает запуску любой команды:
( 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 КБ для значения одного аргумента или определения переменной среды.
Если вам необходимо передать более нескольких сотен байт информации, передайте ее в файле.