シェルのコマンドの前のドットの意味は何ですか?


75

Android Eclipseのデバッグチュートリアルを実行しているときに、次のコマンドが表示されます。

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

私の問題は、前のドットのbuild/envsetup.sh意味ですか?

回答:


79

そのコンテキストのドットは、そのファイルの内容を現在のシェルに「ソース」することを意味します。source自体がシェル組み込みコマンドであること。そして source、ドット演算子は同義語です。

sample.shファイルに次の内容があったとします。

$ cat sample.sh 
echo "hi"
echo "bye?"

今私がそれを調達するとき:

$ . sample.sh 
hi
bye?
$

このようなファイルは、環境変数に物事を追加するなどのセットアップコマンドを組み込むためによく使用されます。

これらのコマンドが別のファイルにあったとしaddvars.shます。

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

現在のシェルの環境には変数がありません。

$ env | grep VAR
$

さて、このファイルを入手すると:

$ . addvars.sh 
$

OK、何もしなかったように見えenvますが、変数を再度チェックすると:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

71

slmの答えに追加するには:

シェルスクリプトを実行するには2つの方法があります。1つは、別のプロセスでスクリプトを実行することです。つまり、シェルの環境(メモリ状態)については、「子」シェルプロセスを実行する前に「親」シェルの状態に戻ります。

たとえば、現在の作業ディレクトリ(ファイルシステム内の場所)はプロセスごとに決定されます。したがって、次のようなスクリプトを作成しましょう。

#!/bin/bash
cd ~
cd ..
pwd

したがって、このスクリプトを呼び出しましょうfoo。このスクリプトを次のように実行してみましょう。./foo

以下が表示されます。

/home

(多数のLinuxおよび他のUNIXクローンディストリビューションがあり、そのいくつかはユーザーのディレクトリを配置しないという標準的な免責事項/home。または、「あなたの走行距離は異なる場合があります」)

さて、このスクリプトを実行した後、このコマンドを入力しましょう

pwd

現在のディレクトリを確認するには、次のように表示されます。

/home/username

理由は、実行したシェルスクリプトには独自の環境(コマンドが実行されていた独自のディレクトリを含む)があり、スクリプトの実行が終了するとその環境がなくなるためです。

さて、fooこのようなスクリプトを実行しましょう

. ./foo

または、同等に:

source ./foo

pwd後で実行すると、次のように表示されます。

/home

その理由は、スクリプトのソースは別のプロセスを呼び出さないからです。親プロセスのすべてのコマンドを手で入力するようなものです。その環境は、スクリプトの終了後も保持されます。


もっと簡単な例を考えてみましょう。次のようなスクリプトを作成しましょう。

#!/bin/bash
exit

名前を付けましょうfoo。実行できることを確認しましょう:chmod 755 foo。次に、次のように実行します。

./foo

何も起こりません。ただし、一方で、これを行う場合:

. ./foo

またはこれ:

source ./foo

ログアウトします。


6
あなたの答えは受け入れられたものよりも良いです、あなたが説明した方法を理解しました、ありがとう!
アーメド

ダンダダデュウウン!(ドラムロールをお願いします)...そして、ここで最も重要なフレーズは次のとおり
ガブリエルステープルズ

5

ピリオド(ドット)は、組み込みのbashの省略形sourceです。現在の環境のファイルからコマンドを読み取って実行し、最後に実行されたコマンドの終了ステータスを返します。ファイルは、現在のディレクトリまたは.exeの任意の場所にありPATHます。実行可能である必要はありません。


1

見つける方法。

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

マニュアルにコンマがないと思います。これは、「現在のシェルでは、ファイルからコマンドを実行します。」と言うべきです
Ctrl + Alt + delor

1

。(ソースまたはドット演算子)
現在のシェルコンテキストのファイル名引数からコマンドを読み取り、実行します。

Syntax
      . filename [arguments]

      source filename [arguments]

sourceは、ドット/ピリオド「。」の同義語です。POSIX shではなくbashであるため、最大限の互換性を得るにはピリオドを使用します。

ソースを使用してスクリプトを実行すると、既存のシェル内で実行され、スクリプトによって作成または変更された変数は、スクリプトの完了後も引き続き使用できます。対照的に、スクリプトがファイル名として実行される場合、スクリプトを実行するために別個のサブシェル(変数の完全に別個のセット)が生成されます。

.ss64script(ドットss64script)とを実行してスクリプトを実行することには微妙な違いがあります。ss64script(ドットスペースss64script)

最初は「ls」コマンドで非表示になっているファイルを実行しています(ls -aは非表示ファイルを表示しますが)、2番目のオプションはchmodで実行可能ファイルとして設定されていない場合でもss64scriptを実行します。

ソース


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.