Назад | Перейти на главную страницу

не может удалить переменные env из скрипта

Я пытаюсь отключить все переменные среды из сценария. Скрипт работает нормально, но если я запускаю 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