私の仕事にはCentos Linuxボックスがいくつかあります。
私は彼らのための一種の環境変数ツールを作る任務を務めました。
アイデアは、ユーザーがプロジェクトのパラメータ(およびPythonpath "mode")を使用してツールを実行し、Enterキーを押してa)"PROJ"
という新しい変数を作成し、b)PYTHONPATH
新しいフォルダを追加することです。これらの変数の範囲は、ターミナルセッションが開いている間のみ持続します。
私が働いた他の場所でも、このようなことが起こっているのを見ました。しかし、私はそれが何であるかを掘り下げたことがなく、今は自分自身を蹴っています!
私はこれが変数名を与えられたパスにエクスポートするbashスクリプトだと思います。 Pythonは環境変数をエクスポートしますが、保持されません。エクスポートはPythonスクリプトのサブプロセスにのみ適用されるため、スクリプトが終了したら変数も同じです。だから私はそれがbashスクリプトであると結論付けました。
もしそうなら、すべてのボックスにスクリプトが含まれるように(可能であればユーザーが入力しないようにエイリアスを指定する)、このツールをデプロイする最善の方法は何ですかsource <script_location>.sh
?
第二に、パラメータが有効であることを確認する最良の方法は何ですか?正しいプロジェクトコードを含むjsonファイルを考えています。
最後に表示されたパラメータと表示されていないパラメータを混在させることはできますか?たとえば、ユーザーは次のように入力できますか?<tool_name> <project_title> -f
ここで、-fは追加の選択機能ですか?これをすべてのユーザーの~/.bashrcに配布する必要がありますか?
私が探しているものの例がある場合は、正しい方向を教えてください。
答え1
shファイルを作成して定義できます。機能環境が更新されました。関数名は「tool_name」で指定できます。
確認するhttps://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files- 対話型ログインシェルがソースコードを提供します/etc/profile
。システムでこのファイルを確認すると、特定のディレクトリ内のすべてのファイルをインポートするのと同じことがわかります。私のUbuntuベースのシステムでは、
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
だから/etc/profile.d/tool_name.sh
ファイルは次のようになります
# create the tool function to update the environment
tool_name() {
# todo: parse options, validate arguments
export PROJ=$1
PYTHONPATH+=":$PROJ/bin"
}
ユーザーはそれを使用するために特別なものは必要ありません。
複数のボックスに配布する方法を教えてくれるわけではありません。 /etc/profile.dにインストールするには、sudoまたはrootアクセスが必要です。
答え2
環境は子プロセスにのみ渡されます。子プロセスは親プロセスの環境に直接影響を与えることはできません。
ユーザーのシェルで変数を設定するには、シェル自体で設定する必要があります。 1つの方法は、これらの変数を設定するスクリプトを「インポート」することです。つまり、スクリプトは実行中のシェルによって実行されます。
$ source scriptname
スクリプトを呼び出す場合:
$ scriptname
次に、新しいシェル(つまり、新しいプロセス)を起動し、スクリプトを読み、その環境に変数を設定します。ただし、シェルがスクリプト処理を終了すると、終了して新しく作成された環境が破壊されるため、時間が無駄になります。
あるいは、/etc/profile
シェル関数を定義して環境を正しく設定することもできます。これは、ユーザーが関数を呼び出すときにのみ行われます。これは実際にはシェル関数なので、新しいシェルを起動するのではなく、同じシェルで実行されるコマンドを呼び出すようです。
スクリプトまたは関数内で環境を正しく設定するために必要なすべてのチェックを実行できます。