値を失うことなく変数のエクスポートをキャンセルする方法は?

値を失うことなく変数のエクスポートをキャンセルする方法は?

変数をエクスポートするとしましょう。

foo=bar
export foo

今、エクスポートをキャンセルしたいと思います。言い換えれば、私がそうするならば、私はその環境に全くいないsh -c 'echo "$foo"'資格がありませんbar。変数の存在を示す簡単な方法の例です。コマンドは何でも構いません。コマンドの動作は、その環境に変数が存在する場合にのみ影響を受ける可能性があります。foosh -csh -c

私はできます:

  1. unset変数を作成して失います。
  2. env削除するには、各コマンドを使用します。env -u foo sh -c 'echo "$foo"'
    • 現在シェルをしばらく使用したい場合は、これは実用的ではありません。

理想的には変数の値を保存したいのですが、子プロセスに空の変数として表示されたり表示されたりしないようにしたいと思います。

私はこれを行うことができると思います:

otherfoo="$foo"; unset foo; foo="$otherfoo"; unset otherfoo

otherfooすでにあれば踏む危険があります。

これが唯一の方法ですか?標準的な方法はありますか?

ベストアンサー1

標準的な方法はありません。

関数を使用すると、一時変数の使用を回避できます。次の関数は、未設定の変数を未設定のままにし、空の変数を空白のままにする役割を果たします。ただし、読み取り専用または入力された変数などのシェルの特定の機能はサポートされていません。

unexport () {
  while [ "$#" -ne 0 ]; do
    eval "set -- \"\${$1}\" \"\${$1+set}\" \"\$@\""
    if [ -n "$2" ]; then
      unset "$3"
      eval "$3=\$1"
    fi
    shift; shift; shift
  done
}
unexport foo bar

ksh、bash、およびzshでは、.unexportを使用して変数のエクスポートをキャンセルできますtypeset +x foo。これは型などの特別な属性を保持するため、使用することをお勧めします。typeset機能が組み込まれているすべてのシェルにはtypeset +x

case $(LC_ALL=C type typeset 2>&1) in
  typeset\ *\ builtin) unexport () { typeset +x -- "$@"; };;
  *) unexport () { … };; # code above
esac

おすすめ記事