この問題https://superuser.com/questions/319043/running-a-command-without-inheriting-parents-environment親環境を継承せずにコマンドを実行できることをお勧めします。
$ sudo -u "`whoami`" $COMMAND
を使わずにこれを行う方法はありますかsudo
?非常に人気があるため、sudo
まだ移植可能な状態(またはPOSIX)に達していません。
これを試してみましたが、env -i $COMMAND
すべての環境変数を削除するため、正しく機能しません。私が望むのは、コマンドを実行することです基本環境。
ベストアンサー1
login(1)
従来、ログイン時に制限された環境変数セットが設定されていました。通常、ユーザーが自分でログインしてもsu
login
パスワードが必要なため、これは理想的ではありません。 Unix システムは、追加の複雑さやその他の複雑さを持つことができます。たとえば、pam_env(8)
.setsで設定された環境変数を追加または削除できるPAMがあるとしますlogin
。したがって、ユーザーが作成したコピーは、login(1)
PAMセットを介した実際のログインとは異なる環境変数セットを作成できます。
その後、端末とシェルがあります。端末は、「ログイン」シェルで後続のプロセスを開始することも、そうでない場合もあります。ログインとしてマークされている場合、シェルは別のファイルを読み取ることができ、ログインしているインスタンスとログインしていないインスタンスについて異なる環境変数で終わることがあります。このトピックに関する既存の文献があります。。
したがって、Unix、ログインプロセス、ローカルシステム構成、ユーザーが使用するシェル、およびそのシェルのローカル構成によって、異なる環境変数が「デフォルト」に設定されることがあります。
ログインシェルインスタンスを使用すると、適切な環境変数のリストを取得できます。
% export CANARY=tweet
% env -i bash -l -c 'env | grep CANARY'
/Users/jhqdoe/.profile: line 6: set: markdirs: invalid option name
%
env | grep CANARY
これにより、親プロセス(現在の$COMMAND
場所)から環境変数が消去されます。.profile
これは実際のためのものですmksh
。いいえbash
。ただし、上記はコードを通過しないため、ログインワークフローの設定に必要な変数を設定できない可能性があります。新しいログインで確認して内容を確認したら、以下を実行できます。
$ env > def
$ env -i bash -l -c 'env > new'
def
その後、ファイルを比較してどのようにnew
異なるかを確認し(おそらくsort
anddiff
コマンドと一緒に)、コマンドを更新してログインenv
シェルを実行する前に省略した内容を設定できます。
もう一つのアイデアは環境スナップショットそしてデフォルトとして使用します。