bash の「ドット スペース ファイル名」コマンドは何をするのですか?

bash の「ドット スペース ファイル名」コマンドは何をするのですか?

bash シェルを使用する場合、環境変数をテキスト ファイルに保存し、その内容をコピー/貼り付けることがあります (例: exports.txt)。

export FOO=bar
export FIZZ=buzz

誰かがコピー&ペーストの代わりにターミナルに入力する方法を教えてくれました

. exports.txt

コピー/貼り付けと同じ効果が得られます。

この「ドット スペース ファイル名」コマンドが機能するメカニズムは何ですか? 検索用語を考えるのは難しいです。

何が起こっているのか、そしてこのワンライナーが何をしているのかについてのより一般的な詳細を理解したいと思います。

答え1

(「ドット」)コマンド.は、シェルの組み込みsourceコマンドの同義語/ショートカットです。

これにより、指定されたシェル スクリプトが (サブシェルではなく) 現在のシェル コンテキスト内で読み込まれ、実行されます。これにより、ソース スクリプトは、変数の設定やシェル関数およびエイリアスの定義など、呼び出し元シェルの環境を変更できます。

答え2

既存の 2 つの回答はすでに優れていますが、効果が最も「顕著」であると言える例が欠けているように感じます。

script.sh次のような内容のファイルがあるとします。

cd dir

このスクリプトを通常どおり実行すると ( sh script.sh)、次のように表示されます。

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

しかし、スクリプト ( . script.sh) のソースをどこにするかを指定すると、次のようになります。

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

2 番目のケースでは、メイン シェルの作業ディレクトリがどのように変更されたかに注目してください。

これは、(他の回答で指摘されているように) 最初の例が独自のサブシェル ( - コマンドshで開始するプロセスsh。これは基本的に任意のシェル、、、など) で実行されbashdashそこでディレクトリを変更し、何もせずに閉じるためです。一方、2 番目の例はメイン シェルで実行されるため、そこでディレクトリが変更されます。

答え3

ここに例があります。

スクリプトファイル: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

上記の変数のいずれかを印刷しようとすると何も返されません

echo $myvar

しかし、もしそうするなら

. mytest.sh

または

source mytest.sh

その後

echo $myvar

1が印刷されます

Spiffが書いたことに対する視覚的な答え

関連情報