bashで行う「ドットスペースファイル名」コマンドとは何ですか?


30

bashシェルを使用する場合、時々exports.txtのコンテンツをコピー/貼り付けするテキストファイルに環境変数を保持します。

export FOO=bar
export FIZZ=buzz

誰かがコピー/貼り付けの代わりに私に見せてくれたので、端末に入力することができました

. exports.txt

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

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

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


23
実行help . これは非常に短いため、Stack Exchangeエンジンは、コメントするには短すぎると考えています。
ワイルドカード

5
これらの質問がこのサイトでも発生するのはなぜだろうか。Stack OverflowAsk UbuntuUnix&Linuxで何度も回答されています。
fedorqui

ドットスペースを実行するには'. ' args、シングルクォートまたはダブルクォートでを入力する必要があります。そうしないと、引用符で囲まれていないスペースは、行をトークンに解析するときにbashによって食い尽くされます(bashマニュアルの「単語分割」を参照)。
ピーターコーデス

1
bashでは、の代替名はで.ありsource、これは文字通り「このファイルからのソースコマンド」を意味します。
jpaugh

回答:


40

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

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


49
実際にsourceは、POSIXで定義された「ドット」(.)コマンドの非標準で移植性のない同義語/ショートカットであり、逆ではありません。
テルドン

8
bashは、非POSIXモードで非標準sourceおよび非標準を提供し.ます。どちらも現在のディレクトリを検索し$PATHます。POSIXモードでは.、現在のディレクトリを検索しない標準を提供しますsource。どちらのモードでもsource、POSIXの.コマンドと同義です。
hvd

26

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-commandが、これは基本的に任意のシェルだったかもしれない、bashdash、あなたはそれに名前を付ける)、それはそこにディレクトリを変更し、何もせずに閉じます。2番目の例はメインシェルで実行されるため、そこでディレクトリが変更されます。


4

以下に例を示します。

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

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

上記の変数のいずれかを印刷しようとしても何も得られません

echo $myvar

しかし、あなたがするなら

. mytest.sh

または

source mytest.sh

その後

echo $myvar

それは印刷されます1

Spiffが書いたことの視覚的な答え


したがって、例を解釈すると、exportこれらの変数をサブシェルで使用する場合にのみ使用します。export変数が現在のシェルでのみ使用される場合は、ファイルで省略できます。そうですか?
iancoleman

1
まったくその通りです。ただし、シェル環境変数について考える場合、exportコマンドの使用はより便利であり、より理解しやすいものです。たとえば、$ HOMEまたは$ DISPLAY。はい、exportコマンドを使用してシェルセッションまたはサブシェルで変数をエクスポートできますが、そのセッションを終了するとすぐに変数は消えます。
-raism
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.