シェルスクリプトが他のスクリプトを呼び出す3つの方法
スクリプトを先に持っている場合.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つの方法について詳しく説明しました。シェルスクリプトから他のスクリプトを呼び出す方法については、スクリプトハウスの他の関連記事も参考にしてみてください
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン