サブシェルを「プログラム」にする方法

サブシェルを「プログラム」にする方法

次のように、既存のすべての環境変数を無視して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 '*'のみがエクスポートされません。xzshが起動時に受け取り、シェル変数(たとえば、名前付き、改行、または123...など***)にマップできない環境変数、またはzshが環境から取得しない環境変数(たとえば、、$IFS$USERNAMEは、コマンドでまだ同じです。環境を実行します。

$ env '123=x' '***=bar' 'IFS=xyz' zsh
$ (typeset +x -m '*'; env)
_=/usr/bin/env
IFS=xyz
123=x
***=bar

関連情報