Итак, мне нужно предотвратить распознавание множества экспортированных переменных дочерней оболочкой.
Проблема в том, что приложение (Wine+UDK) не будет собирать проекты со слишком большим (>65535) байтами в среде, а у меня их много (95323) после того, как я использую проект (ScriptEchoColor), который разделяет переменные среды между любыми оболочками bash.
Я не могу найти команду, которая позволит мне создать дочернюю оболочку, которая не будет принимать текущие переменные среды, а вместо этого будет использовать только те, которые установлены в моем профиле пользователя и в системе в целом.
Я перепробовал много вариантов, показанных на bash --help
.
решение1
Вы можете использовать env
команду для запуска процесса с чистой средой. Вот пример:
env -i /bin/myprog
Если вам все же необходимо экспортировать некоторые переменные, вы можете сделать это в вызове:
env -i MYVAR=foo /bin/myprog
Команда env необходимаPOSIX.
решение2
env -i somecommand
запускается somecommand
в пустой среде. Вы можете указать аргументы после somecommand
. Если PATH
стерт, вам нужно будет указать полный путь к somecommand
. В качестве альтернативы вы можете сохранить PATH
или задать другое значение.
env -i PATH="$PATH:/another/directory" somecommand
Если вы хотите иметь ту же среду, которая будет после входа, сохраните всего несколько переменных и загрузите свой, .profile
чтобы задать остальные. Если вы используете другую оболочку входа (bash с .bash_profile
, csh с .login
, и т. д.), адаптируйте ее соответствующим образом.
env -i HOME="$HOME" PATH=/usr/local/bin:/usr/bin:/bin USER="$USER" \
sh -c '. ~/.profile; "$@"' _ somecommand
В качестве альтернативы вы можете предпочесть удалить некоторые переменные из среды. env -u VAR1 -u VAR2 somecommand
удаляет VAR1
и VAR2
из среды и запускает somecommand
. В Linux вы можете использовать env -0 | tr '\n\0' '.\n' | sed 's/=.*//'
для создания списка переменных среды с одним именем на строку, подходящего для фильтрации. В других вариантах unix env | sed 's/=.*//'
выполняет ту же работу, с ограничением, что может обнаружить ложные срабатывания, если значения некоторых переменных содержат символы новой строки.
решение3
Вызов typeset +x variable_name...
или declare +x variable_name...
команда. Вы даже можете использовать регулярные выражения для имен переменных, например typeset +x ${!MY_VAR_*}
.