web-dev-qa-db-ja.com

bashのクリーンな環境でプログラムを実行する方法は?

空の環境で(つまり、変数が設定されていない)プログラムを実行したい。これをbashで行う方法は?

121
Eugene Yarmash

envでこれを行うことができます:

env -i your_command

以下のコメントとは異なり、このdoesは環境を完全にクリアしますが、your_command新しい変数を設定します。特に、シェルを実行すると/etc/profileを実行すると、シェルにもいくつかの組み込み設定がある場合があります。

これは次の方法で確認できます。

env -i env

つまり、環境を消去してから印刷します。出力は空白になります。

135
ams

「クリーン」なbash環境は、

$ env -i bash --noprofile --norc
  • env -iコマンドは、古いシェル環境のエクスポートされた環境変数を実行されたプログラムの環境に転送せずに、コマンドラインで指定されたコマンドを実行します。

  • --noprofileオプションは、bashがシステム全体または個人のシェル初期化スクリプトを読み取らないようにします。そうしないと、ログインシェルで読み取られます。

  • --norcオプションを使用すると、bashが、対話型シェルで読み取られる個人用シェル初期化スクリプトを読み取ることができなくなります。

41
Kusalananda

env -i somecommandamsはすでに述べた のように、空の環境でコマンドを実行します。

多くのプログラムはいくつかの重要な環境変数に依存しているため、それらを保持したい場合があります。

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

または、小さなログイン時環境にログインすることもできます。

ssh localhost somecommand

受け入れられた答えは正しいですが、あなたが通常したいことは次のことです:

env -i bash -l -c "printenv; and any other commands"

これはあなたに素朴で機能的なbashを与えます(非対話モードでログインしたときに得られるのと同じです)。たとえば、言語、タイムゾーン、HOMEなどを設定します。

4

ここでのほとんどの回答の問題は、env -iHOMEをクリアすることです。そのため、内部でbash -lを実行しても、.bash_profileなどを読み取れません。あなたが探しているのは、あたかも新しいログインをしたかのように振る舞うシェルで、代わりにこれが欲しいでしょう:

env -i HOME="$HOME" bash -l -c 'your_command'

例:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
1

Balkiのコメントに答えるには(そしてプロセス中に自分の質問に答えるには:-):

% echo Environment in calling Shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling Shell: vars: 43

==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.

#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh

echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
0
Coroos

スクリプトがクリーンな環境であることを確認したい場合は、次の小さな例が示すように、Shebang行を変更できます。

#!/usr/bin/env -S -i bash
env

このように環境を表示します

PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env

ここでは、bashシェルをenvを介して実行します。このシェルは、環境のクリーンアップを指示する-i引数を取ります。 -SShebang行で複数の引数を渡す場合に必要 です。

0
starfry