エクスポートはオプションだといつも感じていました。エクスポートとは何かは知っていますが、ローカル変数をグローバル変数(実際には環境変数と呼ばれます)に変換するだけではありませんが、影響はないようです。今日この記事を読みました。ついに実現したブログ。あなた自身の言語と考え方でそれを再編成してください
まず、
親シェルと子シェルの2つの概念を説明し、shellAからシェルを開始し、shellBと呼びます。ShellAは親シェルであり、shellBは子シェルです。
理解するのが最も簡単な状況は、シェルでgnome-terminalコマンドを実行することです(異なるデスクトップ環境コマンドは同じではありません)。新しいシェル
をポップアップする最も一般的なケースは、実際にはサブシェルにある現在のシェルでスクリプトを実行することです。で実行
コンセプトは完成しました、それは退屈に感じます、実験について話します
最も一般的なケースの例を次に示します。現在のシェルでスクリプトを実行する
現在、3つのスクリプト
exp1.shがあります
var = "hello、world"
exp2.sh
var = "hello、world"
export var
test.sh
エコー$ var
実験1:
ソースexp1.shecho
$ var
bash test.sh
結果:
実験2:
ソースexp2.shecho
$ var
bash test.sh
結果:
現在のシェルでecho $ varを実行しても問題がないことがわかりますが、bash test.shを実行すると、実験1では出力がなく(変数varが見つかりません)、varの値が実験2でエコーアウトされます。exp2.shが実験2でエクスポートを追加したため、varは環境変数になり、varはサブシェルに表示されます。また、実験1にはエクスポートvarがないため、varはローカル変数であり、サブシェルからは表示されません。
もう少し言いますと、環境変数(PATHなど)がLinuxのprofileまたはbashrcまたは他の同様のファイルに設定されている場合、エクスポートがない場合は、直接開始されたシェルでのみ機能します。スクリプトを実行した場合、またはサブシェルは実際にはローカル変数であるため、直接開始します。サブシェルは見えないので、ggです
Linuxソースコマンド:
一般的な使用法:ソースファイルパスまたは。ファイルパス
機能:現在のシェルに、パスがfilepathであるシェルファイルを読み取らせ、ファイル内のすべてのステートメントを順番に実行します。通常、新しく変更された初期化ファイルを再実行して、ログアウトして再度ログインしなくてもすぐに有効にするために使用されます。たとえば、/ etc / profileファイルを変更して、再度ログインせずにすぐに有効にする場合は、source / etc / profileなどのsourceコマンドを使用できます。
(Cシェルからの)sourceコマンドは、bashシェルの組み込みコマンドです。(Bourneシェルからの)ドットであるdotコマンド(。)は、sourceの別名です。これは使用法からも見ることができます。
ソースファイルパスとshファイルパスおよび./filepathの違い:
-
シェルスクリプトに実行権限がある場合、shfilepathと./filepathに違いはありません。./filepathは、現在のディレクトリがPATHにないため、すべての「。」は現在のディレクトリを示すために使用されます。
-
sh filepathはサブシェルを再作成し、サブシェルのスクリプト内のステートメントを実行します。サブシェルは親シェルの環境変数を継承しますが、サブシェルは新しく作成され、変更された変数は使用されない限り親シェルに戻されません。書き出す。
-
実際、ソースファイル名は、新しいサブシェルを作成せずに、スクリプト内のステートメントを読み取り、現在のシェルで順番に実行するだけです。次に、スクリプト内のすべての新規および変更されたステートメントが現在のシェルに保存されます。
例えば:
-
次の内容で新しいtest.shスクリプトを作成します。A= 1;
-
実行権限を変更します。chmod+ x test.sh;
-
sh test.shを実行した後、A = 1が現在のシェルに返送されないため、echo $ Aは空として表示されます。
-
./test.shを実行した後、同じ効果。
-
ソースtest.shまたは.test.shを実行してから、$ Aをエコーすると、1が表示され、A = 1の変数が現在のシェルにあることを示します。