web-dev-qa-db-ja.com

スクリプトから環境変数を設定解除できません

スクリプト内からすべての環境変数の設定を解除しようとしています。スクリプトは正常に実行されますが、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

ありがとう!

2
w00t

これは基本的に標準的な答えです。スクリプトは新しい子プロセスで実行されるため、これを行うことはできません。そのプロセスは独自の環境を取得し、変数を設定したり、設定を解除したりするために、親の環境を変更することはできません。

.コマンドを使用して、現在の環境でスクリプトを実行できます。また、同じ方法で/ etc/profileを入手できます。

。/etc/profile

8
mattdm

スクリプトを実行しようとしましたが、機能しません。

私は少しグーグルしてこれを見つけました:

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)

それも機能します。

コマンドを対話的に実行する場合とスクリプトから実行する場合に違いがあるかどうかはわかりません。

3
cstamas

Unsetコマンドに-vを使用して、環境からアイテムをリッピングします。このテストスクリプトの最後に、$ 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
0
user15590