как предотвратить распознавание/доступность экспортированных переменных среды дочерней оболочкой (bash)?

как предотвратить распознавание/доступность экспортированных переменных среды дочерней оболочкой (bash)?

Итак, мне нужно предотвратить распознавание множества экспортированных переменных дочерней оболочкой.

Проблема в том, что приложение (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_*}.

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