新しいシェルでプログラムを実行するには?

新しいシェルでプログラムを実行するには?

環境をたくさん操作するプログラムがあります。 PYTHONPATH や LD_LIBRARY_PATH などの項目を設定します。

このプログラムは他のプログラムを実行する必要がありますが、すべての環境操作なしで新しい環境でrcファイルのデフォルト環境を使用する必要があります。

csh -cを使用するとこれを行うことができるようですが、そうすると現在の環境が保存されます。これを行うための良い方法はありますか?

私がこれにどのシェルを使用しているかは問題ではありません。また、元の.rcファイルが必要なため、env -iが正しく機能しません。 (envとbash -clを一緒に使用すると、何かをハックできるようですが、より良い方法があります)

答え1

新しいプロセスをフォークすると、環境が保護されます。

特定の環境でプロセスを実行する必要がある場合は、そのプロセスで開始されたすべてのプロセスもその環境を使用します。

ただし、汚染されていない環境をファイルとして保存できますexport >original_env

後でこのファイルを使用して、汚染された環境をクリーンアップし、古いenv -i環境をインポートできます。

答え2

これが最適かどうかはわかりませんが、小規模テストでは次のような結果が得られました。

env -i /bin/bash -cl 'COMMAND'

明らかに、-lは他の引数と共存しないため、-clを使用してcshを実行することはできませんが、bashでは可能です。

到着予定時刻:

私が実際に使用するものは次のとおりです。

#!/bin/csh -f
set evs = ""
if ($1 == '--envVars') then
    set envs = "$2"
    shift
    shift
endif

env -i $envs CMD="$*" /bin/bash -c '$CMD'

必要に応じて、コマンドラインで$ PATHや$ PYTHONPATHなどのENV変数を入力できます。

答え3

私が考える最も簡単な方法は、export変数を使用しないことです。ユースケースに応じて、これが可能な場合と不可能な場合があります。たとえば、

$ cat a.sh
#!/bin/bash
BAR=foo
export BAZ=foo
bash -c 'echo "bash -c : BAR: $BAR, BAZ: $BAZ"'
echo "normal  : BAR: $BAR, BAZ: $BAZ"

$ ./a.sh
bash -c : BAR: , BAZ: foo
normal  : BAR: foo, BAZ: foo

上記の例に示すように、で始まるシェルはエクスポートされたbash -c変数にのみアクセスできます。

答え4

私が見つけた唯一の方法はsudoを使用することです(許可されている場合)。

sudo -u "$USER" path_to_script

スクリプト例:

#!/bin/sh
set | grep ARGH

使用法:

$ export ARGH=yes
$ sudo -u "$USER" ./check_env
(empty line, so ARGH is not set)

関連情報