Я пытаюсь отключить все переменные среды из сценария. Скрипт работает нормально, но если я запускаю env, он все равно показывает все установленные переменные.
Если я запускаю команду из CLI, она работает, и переменные не установлены.
unset `env | awk -F= '/^\w/ {print $1}' | xargs`
Есть идеи, как запустить это из сценария?
Кроме того, есть идеи, как получить / etc / profile из сценария? Это тоже не работает.
Мне нужно установить переменные с одинаковыми именами, но разными путями, в зависимости от экземпляров, которые нужны моим пользователям.
Позже отредактируйте:
хорошо, у меня получилось это (скорее не элегантное, но какое-то другое) решение:
. script
который содержит:
unset `env | awk -F= '/^\w/ {print $1}'|egrep -v "HOSTNAME|TERM|SHELL|HISTSIZE|SSH_CLIENT|SSH_TTY|USER|LS_COLORS|KDEDIR|MAIL|PATH|INPUTRC|PWD|LANG|HISTIGNORE|SSH_ASKPASS|TEST|SHLVL|HOME|LD_ASSUME_KERNEL|LOGNAME|SSH_CONNECTION|LESSOPEN|HISTTIMEFORMAT|G_BROKEN_FILENAMES|_"|xargs`
source env_variable_file
Спасибо!
По сути, это стандартный ответ. Вы не можете этого сделать, потому что сценарий запускается в новом дочернем процессе. У этого процесса есть своя собственная среда, и он не может изменить среду родителя ни для установки переменных, ни для их отмены.
Вы можете запустить сценарий в текущей среде, используя .
команда. Таким же образом можно получить / etc / profile:
. / etc / profile
Я пытался запустить ваш скрипт, но у меня он не работает.
Я немного погуглил и нашел это:
unset $(/usr/bin/env | egrep '^(\w+)=(.*)$' | \
egrep -vw 'PWD|USER|LANG' | /usr/bin/cut -d= -f1);
Этот действительно работает ;-)
Для поиска файлов
source /etc/profile
это правильный путь, как вы сказали.
Если я изменю ваш скрипт вот так
unset $(env | awk -F= '{print $1}' | xargs)
это тоже работает.
Я не думаю, есть ли разница между запуском команды в интерактивном режиме и из сценария.
Используйте -v для команды unset, чтобы извлечь элементы из окружения; обратите внимание в конце этого тестового сценария, как вы можете получить ошибки, потому что мы отключили $ PATH, поэтому он не может найти программы, такие как 'id' и тому подобное.
#!/bin/sh
LIST=`env | awk -F= '/^\w/ {print $1}' | xargs`
for item in $LIST; do
echo "$item = ${!item}";
done
unset -v $LIST
for item in $LIST; do
echo "$item = ${!item}";
done
HISTSIZE=5555
echo $HISTSIZE
source /etc/profile
echo $HISTSIZE