次のように、既存のすべての環境変数を無視して1つだけエコーしたいと思います。
env -i <(
export foo=bar;
env
)
これにより、次のように印刷されます。
foo=bar
しかし、建設
env -i <()
私の直感はうまくいくはずですが、うまくいかないようです。 env -iを実行するインラインプログラムをここでどのように作成できますか?
答え1
envに実際のプログラムを提供します。
env -i bash -c '
export foo=bar
env
'
これは$PATH
環境変数も削除するため、bash
システムのデフォルトのコマンド検索パスにないと機能しません。
bash
通訳者を渡す前に、通訳者のパスを調べることができますenv
。
env -i -- "$(command -v bash)" -c '
export foo=bar
env
'
起動するシェルでbash
コマンドを検索するのに同じ問題がある可能性がありますenv
。
答え2
すべての変数をエクスポートせずにサブシェルでコマンドを実行することが重要な場合は、zshで次のことを実行できます。
(
typeset +x -m '*'
those-commands
)
他の多くのシェルと同様に、zsh は自動的に_
環境変数と実行されるファイルのパスを実行するコマンドの値として渡します。
このフラグを使用すると、シェル変数typeset +x -m '*'
のみがエクスポートされません。x
zshが起動時に受け取り、シェル変数(たとえば、名前付き、改行、または123
...など***
)にマップできない環境変数、またはzshが環境から取得しない環境変数(たとえば、、$IFS
)$USERNAME
は、コマンドでまだ同じです。環境を実行します。
$ env '123=x' '***=bar' 'IFS=xyz' zsh
$ (typeset +x -m '*'; env)
_=/usr/bin/env
IFS=xyz
123=x
***=bar