システムでのシェルの単純な呼び出しは、定義されているエイリアス(または関数)を継承しないmodule
ため、シェルはそれを見つけることができません(以下の抜粋付きの注を参照)。type module
プロンプトから試して、module
現在どのように定義されているかを確認してください。
基本的にソースを使用するのは、キーボードからスクリプトの各行を書く場合のようなものです。
一方では、現在のシェルのすべての特定の履歴を継承しますが、他方では、現在のシェルがスクリプトおよびmodule
呼び出しのすべての側面の影響を受けることに注意してください。
スクリプトのソースと実行の違いについては、 SuperUser Sep 2009またはDec 2009、Ubuntu Feb 2011、Unix Aug 2011、Stackoverflow Dec 2012などで読むことができます。
これに関して、Modulefiles セクションに警告があります:
...モジュールファイルをアンロードすると、環境変数が設定解除されます。したがって、環境変数を以前の状態に戻すことなく、モジュールファイルをロードしてからアンロードすることができます。
したがって、スクリプトで実行する方が賢明です。
後者を達成するために、私は考えることができます:
対話型シェルを使用するには、現在のシェルの特定の履歴を無視し、スクリプトのシェバンを次のように変更します。
#!/bin/bash -i
対話型シェルは、ttyのユーザー入力からコマンドを読み取ります。とりわけ、このようなシェルはアクティベーション時にスタートアップファイルを読み取り、プロンプトを表示し、デフォルトでジョブ制御を有効にします...
代わりに、現在のシェルの特定のストーリーを継承したい場合は、それをソースにしようとすることができます...しかし、サブシェルで
( source runit.sh )
module
withの現在のエイリアス/関数を見つけてtype module
、結果としてスクリプトを修正してください。一部の環境変数はに設定できないことに注意してくださいmodule
。
必要に応じて、ディレクトリで初期化スクリプトを見つけることができます$MODULESHOME/init/<shell>
。
コメントモジュールのQ&Aで
記憶されているとおり
子プロセス(スクリプト)は親プロセス環境を変更できません。スクリプト内のモジュールのロードは、スクリプト自体の環境にのみ影響します。スクリプトで現在の環境を変更できる唯一の方法は、スクリプトを読み込んで現在のプロセスに読み込むことです。
したがって、現在の環境の変更を避けたい場合は、シバンを変更するか(1)、またはサブシェルでスクリプトをソースする(2)ことをお勧めします。case(3)の使いやすさについては完全にはわかりません。
ノート
のマニュアルや説明のページから抜粋モジュール
module
モジュールパッケージへのユーザーインターフェイスです。module
エイリアスや関数が実行しmodulecmd
たプログラムを、シェルがコマンドの出力を評価しています。の最初の引数modulecmd
は、シェルのタイプを指定します。
Modulesパッケージとmodule
コマンドは、シェル固有の初期化スクリプトがシェルにソースされると初期化されます。このスクリプトは、エイリアスまたはシェル関数としてモジュールコマンドを作成し、Modules環境変数を作成します