空の環境で(つまり、変数が設定されていない)プログラムを実行したい。これをbashで行う方法は?
env
でこれを行うことができます:
env -i your_command
以下のコメントとは異なり、このdoesは環境を完全にクリアしますが、your_command
新しい変数を設定します。特に、シェルを実行すると/etc/profile
を実行すると、シェルにもいくつかの組み込み設定がある場合があります。
これは次の方法で確認できます。
env -i env
つまり、環境を消去してから印刷します。出力は空白になります。
「クリーン」なbash
環境は、
$ env -i bash --noprofile --norc
env -i
コマンドは、古いシェル環境のエクスポートされた環境変数を実行されたプログラムの環境に転送せずに、コマンドラインで指定されたコマンドを実行します。
--noprofile
オプションは、bash
がシステム全体または個人のシェル初期化スクリプトを読み取らないようにします。そうしないと、ログインシェルで読み取られます。
--norc
オプションを使用すると、bash
が、対話型シェルで読み取られる個人用シェル初期化スクリプトを読み取ることができなくなります。
env -i somecommand
amsはすでに述べた のように、空の環境でコマンドを実行します。
多くのプログラムはいくつかの重要な環境変数に依存しているため、それらを保持したい場合があります。
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などを設定します。
ここでのほとんどの回答の問題は、env -i
がHOME
をクリアすることです。そのため、内部で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
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."
スクリプトがクリーンな環境であることを確認したい場合は、次の小さな例が示すように、Shebang行を変更できます。
#!/usr/bin/env -S -i bash
env
このように環境を表示します
PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env
ここでは、bash
シェルをenv
を介して実行します。このシェルは、環境のクリーンアップを指示する-i
引数を取ります。 -S
は Shebang行で複数の引数を渡す場合に必要 です。