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


回答:


127

これを行うにはenv

env -i your_command

以下のコメントに反して、これ環境を完全にクリアしますが、your_command新しい変数の設定を妨げません。特に、シェルを実行するとが実行され、シェルには/etc/profileビルトイン設定が含まれている場合があります。

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

env -i env

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


4
環境を完全にクリアするわけではありません: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
l0b0

2
しかし、あなたが得ることができる最も近いと思われる-それはのような変数のように思えるPATHPWDSHLVLバッシュによって自動的に設定されています。+1。
l0b0

3
@ I0b0:編集を参照してください。
AMS

3
最初のコメント作成者のスクリプトのPATH変数は環境内にないため、環境変数ではありません。Bashは、もしエクスポートされていない場合、PATHと呼ばれる独自の通常のシェル変数を設定し 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:."
バイナリPhile

34

「クリーン」なbash環境は

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

  • この--noprofileオプションはbash、システム全体または個人用のシェル初期化スクリプトの読み取りを停止します。これは、ログインシェル用に読み取られるものです。

  • この--norcオプションはbash、対話型シェル用に読み込まれる個人用シェル初期化スクリプトの読み込みを停止します。


私のenvはこれらのオプションを認識しません。
パウロ

@PauloCarvalhoお使いのシステムはサポートしていませんenv -iか?どのシステムを使用していますか?
クサラナナンダ

申し訳ありませんが、シェルで動作します。スクリプトに入れようとしましたが、どういうわけかエラーをスローしました。
パウロ

@PauloCarvalho申し訳ありませんが、入力したコマンドや、取​​得したエラーの内容を確認できません。
クサラナンダ

素晴らしい-まさに私が探していたもの。env私の環境をきれいにし、--noprofile/ etc / profileと友達の--norc調達を避け、〜/ .bashrcと友達の調達を避けます。
フェリペアルバレス

28

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

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

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

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

ssh localhost somecommand

1
コマンドラインでコマンドを実行するときに機能します。どのようにしていないようだ?私はシェバングでこれを入れてやる仕事
バルキ

奇妙なことに、my env--区切り文字をサポートしておらずenv -i FOO=bar -- env、というコマンドを実行しようとしてい--ます。
antak

@antakそれはenv -i -- FOO=bar env実際にあるはずです。私の悪い。後に--続くものがで始まらないので、が有用であるというわけではありません-
ジル

常にローカルホストにsshできるとは気づかなかったが、それはちょっと奇妙だ。そこのユースケースは何ですか。
エドガーAroutiounian

@EdgarAroutiounian SSHサーバーを実行している場合は、localhostにSSHで接続できます。なぜプログラマはそれを禁止する努力をするのでしょうか?
ジル

4

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

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

これにより、むき出しの機能的なbashが得られます(非対話型モードでログインした場合と同じです)。たとえば、これは言語、タイムゾーン、HOMEなどを設定します。


env -iclears HOME、つまりbash -l自分.bash_profileなどを見つけることができないため、それはまったく機能しません。新しいログインで取得するようなシェルが必要な場合は、HOME最初に設定するために追加の間接指定が必要です。
エリオット虐殺

この回答を参照してください:unix.stackexchange.com/a/451389/157340
エリオットスローター

1

ここでのほとんどの答えの問題は、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

1
ログインbashシェルが実行される.bash_loginか、に注意してください.bash_profile。クリーンな環境を取得するには、を使用する--noprofileか、HOMEこれらのファイルが存在しないディレクトリに設定します。私はそれがあなたが「きれい」と言っているものに依存していると思います。
クサラナナンダ

1
はい、文字通り何も入っていないシェルが必要な場合は、元の答えに従ってくださいenv -i bash -c ...。この答えは、マシンに新たにログインしたばかりのように見えるシェルが必要な場合に特に該当します。
エリオット虐殺

0

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."

私はCentOSの7.6での私のシェバング行でこれをしようとすると、私はENVからこのエラーを取得する:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

私は長い引数を使用するスクリプトを変更した場合--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.
ScottJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.