空の環境でプログラムを実行したい(つまり、変数が設定されていない)。bashでこれを行う方法は?
空の環境でプログラムを実行したい(つまり、変数が設定されていない)。bashでこれを行う方法は?
回答:
これを行うにはenv:
env -i your_command
以下のコメントに反して、これは環境を完全にクリアしますが、your_command新しい変数の設定を妨げません。特に、シェルを実行するとが実行され、シェルには/etc/profileビルトイン設定が含まれている場合があります。
これは次の方法で確認できます。
env -i env
つまり、環境を拭いてから印刷します。出力は空白になります。
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shprints /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。
PATH、PWDとSHLVLバッシュによって自動的に設定されています。+1。
env -i bash --norc -c "declare -p PATH"ますdeclare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."。あなたはそれを自分でエクスポートする場合のために「-x」は、エクスポート(および環境のため、一部)注意:env -i bash --norc -c "export PATH; declare -p PATH"与えますdeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
「クリーン」なbash環境は
$ env -i bash --noprofile --norc
このenv -iコマンドは、古いシェル環境のエクスポートされた環境変数を実行されたプログラムの環境に転送することなく、コマンドラインで指定されたコマンドを実行します。
この--noprofileオプションはbash、システム全体または個人用のシェル初期化スクリプトの読み取りを停止します。これは、ログインシェル用に読み取られるものです。
この--norcオプションはbash、対話型シェル用に読み込まれる個人用シェル初期化スクリプトの読み込みを停止します。
env -iか?どのシステムを使用していますか?
env私の環境をきれいにし、--noprofile/ etc / profileと友達の--norc調達を避け、〜/ .bashrcと友達の調達を避けます。
env -i somecommandamsがすでに述べたように、空の環境でコマンドを実行します。
多くのプログラムはいくつかの重要な環境変数に依存しているため、それらを保持することをお勧めします。
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
あるいは、小さなログイン時間環境にログインすることもできます。
ssh localhost somecommand
envは--区切り文字をサポートしておらずenv -i FOO=bar -- env、というコマンドを実行しようとしてい--ます。
env -i -- FOO=bar env実際にあるはずです。私の悪い。後に--続くものがで始まらないので、が有用であるというわけではありません-。
受け入れられた答えは正しいですが、通常あなたがしたいことは:
env -i bash -l -c "printenv; and any other commands"
これにより、むき出しの機能的なbashが得られます(非対話型モードでログインした場合と同じです)。たとえば、これは言語、タイムゾーン、HOMEなどを設定します。
env -iclears HOME、つまりbash -l自分.bash_profileなどを見つけることができないため、それはまったく機能しません。新しいログインで取得するようなシェルが必要な場合は、HOME最初に設定するために追加の間接指定が必要です。
ここでのほとんどの答えの問題は、env -iclears 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
bashシェルが実行される.bash_loginか、に注意してください.bash_profile。クリーンな環境を取得するには、を使用する--noprofileか、HOMEこれらのファイルが存在しないディレクトリに設定します。私はそれがあなたが「きれい」と言っているものに依存していると思います。
env -i bash -c ...。この答えは、マシンに新たにログインしたばかりのように見えるシェルが必要な場合に特に該当します。
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."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment、私はこれを取得:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.