2010-09-24 2 views
3

Я хочу установить переменную окружения в bash, которая начинается с цифры. Окружающая среда процесса может содержать такие переменные (это просто все равно). Но в оболочке вам нужно создать переменные, а затем экспортировать их, чтобы они переходили в среду. Есть ли способ добавить какое-то значение в среду оболочки, не касаясь переменных, или создать переменную, начинающуюся с цифры?bash переменные окружения, начинающиеся с цифры

+1

Хорошо, я думаю, что я нашел ответ в Баш-4.1 список изменений: Bash теперь передает переменные среды с именами, которые недействительны имена переменных оболочки через среду, переданную дочернему процессу . Просто нужно обновить. – valeryz

+1

Похоже, что изменение 4.1 означает, что если у меня есть переменная 386 = 1 в моем родительском процессе, то когда я форк, она не удалит ее, и она будет доступна для детей. – valeryz

ответ

2

Единственными допустимыми типами начального символа для переменных bash являются буквы и символы подчеркивания.

+0

Это верно для переменных. Но процессная среда просто не волнует. Теперь, как это сделать, без ограничений переменной bash? – valeryz

+0

@valeryz: вам нужно будет манипулировать средой в программе на C и использовать 'execve()', чтобы передать его в bash. Это не удобно или разумно. Вы также можете создать несколько записей для одной переменной таким образом - это тоже не удобно или разумно. –

0

Почему вы хотите это сделать? Вы можете сделать:

export _1="some value" 

или

export a1="some value" 

Причина, по которой вы не можете делать то, что вы спрашиваете, что переменная типа «$ 1» будет путать с позиционным параметром $1.

+1

Потому что я делаю это в Cygwin для утилиты WinDDK «build», которая хочет переменную «386». Я понимаю причины, по которым он не работает, как вы это понимаете. – valeryz

4

Единственный способ, которым я мог думать, начав новую оболочку с помощью env:

env 0FOO=BAR /usr/bin/bash 

Я попробовал это под Cygwin, и это, казалось, работало.

+0

Это хорошо, спасибо! Я обнаружил, что могу перейти на bash 4.1, но ваш подход должен работать в любом месте, для меня необходим дополнительный процесс bash. – valeryz

+0

Умный; Интересно, если это ошибка или функция в 'env'. –

+0

Как отмечает @valeryz, для идентификаторов в блоке рабочей среды нет одинаковых ограничений (IAFAIK - если кто-то видел некоторые, прокомментируйте), как есть в переменных bash. Поскольку env не нарушает правила bash для переменных bash (это вообще обходит их), это использование казалось бы кошерным для меня. –

0

обработка требуется кропотливая и утомительная и не страшно разумным, но (в общих чертах, проверка ошибок на malloc() опущены):

char **env = environ; 
while (*env != 0) 
    *env++; 
char **newenv = malloc((env - environ + 1) * sizeof(*newenv)); 
memcpy(newenv, environ, (env - environ) * sizeof(char *)); 
newenv[env - environ] = "386=pygmalion"; 
newenv[env - environ + 1] = 0; 
char *args[] = { "modded-env-bash", 0 }; 
execve("/bin/bash", args, newenv); 
exit(1); 
+2

Почему бы не putenv() или setenv() работать? – valeryz

+0

Для этого требуется индивидуальное программирование (хотя ясно, что имя и значение env var могут быть собраны из командной строки), и не так аккуратно, как использование программы env, предложенной Bert F. –

+1

@valeryz: Они могли бы - они не могли. Есть достойный шанс 'putenv()' будет работать, но он может проверить, что вы поставляете; есть неплохая возможность 'setenv()' не будет работать, потому что он принимает имя и значение отдельно и может проверять имя (хотя POSIX только говорит, что знаки «=» не разрешены, а все остальное - честная игра).ОК, перепишите код, чтобы использовать 'setenv()' ... получайте удовольствие. Лучше использовать команду 'env', если она работает там, где вам это нужно. –

Смежные вопросы