1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトが他のスクリプトを呼び出す3つの方法

2022-02-09 12:38:58

スクリプトを先に持っている場合.sh.

#! /bin/bash
#------------------
#@file:first.sh
#------------------
echo 'your are in first file'

他のシェルスクリプトからfirst.shを呼び出すにはどうしたらよいですか?主な方法は、source、dot、shコマンドの3つです。

1. ソース

#! /bin/bash
#---------------
#@file:second.sh
#---------------
echo 'your are in second file'
source first.sh

2.ドット.

#! /bin/bash
echo 'your are in second file'
. first.sh

ドットとスクリプトファイルの間にスペースを入れることを忘れないように注意してください。

3. shコマンド

#! /bin/bash
echo 'your are in second file'
sh first.sh

3つとも出力されます。

は2番目のファイルです。
最初のファイルにあります。

4. の違いについて

sourceコマンドとドット.コマンドは、C/C++の#includeプリプロセスコマンドと同様に、指定したスクリプトの内容をシェルプロセスで実行される現在のスクリプトにコピーするという点で同等です。shコマンドを使用して別のスクリプトを呼び出す方法は、前の2つの方法とは根本的に異なります。shコマンドは,指定されたスクリプトを実行するために新しいShellプロセスを開くので,親プロセスの変数には子プロセスではアクセスできないようになっています.次のコードを参照してください。
first.shは次のように読み、second.shの変数secondにアクセスする。

#! /bin/bash
echo 'your are in first file'
echo 'second:' $second

second.shの内容で、上記の3つの方法でfirst.shを呼び出して、second.shの変数secondへのアクセスの違いを見てみてください

#! /bin/bash
second=lvlv
echo 'your are in second file'
source first
. first
sh first

プログラムの出力は

は2番目のファイルにあります。
最初のファイルにあります
2番目:lvlv
最初のファイルにある
2番目:lvlv
最初のファイルにある
の2つ目です。

このように、shコマンドを使って子プロセスを開き、指定されたシェルスクリプトを呼び出しても、親プロセスの変数にアクセスすることはできないのです。子プロセスが親プロセスの変数にアクセスできるようにするには、どうしたらよいでしょうか。exportコマンドを使えばいいのです。

5. exportコマンドは一時的な環境変数を設定する

シェル変数は、そのスコープとライフサイクルによって、シェルでは大きく4つに分類されることを知っておく必要があります。
(1)恒久的な環境変数。設定ファイルを変更する必要があり、変数は永続的に有効となります。
(2) 一時的な環境変数:exportコマンドラインを使用して宣言することができ、変数はシェルスクリプトのプロセスが終了した後も有効ですが、現在のシェルセッションを閉じた後に失効します。
(3) グローバル変数:スクリプトで定義され、現在のシェルスクリプトでのみ有効で、他のシェルスクリプトプロセスからはアクセスできない。その範囲は、定義されたところから始まり、スクリプトが終了するか削除されたことが示されたところで終了する。なお、グローバル変数はシェル関数の内部でも外部でも定義可能です。シェル関数の内部で定義された変数はデフォルトでグローバル変数となり、そのスコープは関数が呼び出されたときに変数が定義された場所"からスクリプトが終了するか削除が示される場所までとなるためです。
(4) ローカル変数。localキーワードで定義された変数は、シェルスクリプト内の関数内に表示されます。そのスコープは関数内に限定されます。同じ名前のローカル変数は、グローバル変数をブロックします。

つまり、exportコマンドで一時的な環境変数を宣言していることになり、現在のシェルセッションのすべてのシェルインスタンスはexportコマンドで宣言された一時的な環境変数にアクセスすることができるのです。現在のシェルセッションに含まれるすべてのシェルインスタンスは、現在のシェルセッションの子であるため、親プロセスと一緒に環境変数にアクセスすることができます。

Second.shを以下のように変更します。

#! /bin/bash
export second=lvlv
echo 'your are in second file'
sh first.sh

second.shを実行すると、出力されます。

<ブロッククオート

は2番目のファイルです。
最初のファイルにあります
2番目:lvlv

この時点で、exportコマンドは、Shellの子プロセスが親プロセスの変数にアクセスできるように、一時的な環境変数を設定します。

6. export コマンドは永続的な環境変数を設定する

では、永続的な環境変数はどのように定義するのでしょうか。次のような2つの方法があります。

(1) /etc/profile ファイルに、すべてのユーザーにとって永続的な環境変数を追加します。例えば、/etc/profileファイルをvimで編集し、最後の行にCLASSPATH変数を追加します。

export CLASSPATH=. /JAVA_HOME/lib;$JAVA_HOME/jre/lib

なお、ファイルを修正した後、すぐに反映させるためには source /etc/profile そうでない場合は、次にログインし直したときにのみ有効になります。

(2) ~/.bash_profile ファイルに、現在のユーザーにのみ永続的に利用可能な環境変数を追加します。例えば、vimで編集することで ~/.bash_profile ファイルを作成して環境変数を追加します。

export CLASSPATH=. /JAVA_HOME/lib;$JAVA_HOME/jre/lib

注意:ファイルを変更した後、すぐに効果を発揮させるためには source ~/.bash_profile そうでない場合は、次にログインし直したときにのみ有効になります。

また、環境変数を削除したい場合は、unset(組み込み)コマンドでクリアすることも可能で、例えば次のようになります。 $unset CLASSPATH . 読み取り専用の変数は、readonlyコマンドで設定することができます。readonlyコマンドを使用した場合、その変数を変更したりクリアしたりすることはできません。

以上、シェルスクリプトから他のスクリプトを呼び出す3つの方法について詳しく説明しました。シェルスクリプトから他のスクリプトを呼び出す方法については、スクリプトハウスの他の関連記事も参考にしてみてください