2017-01-18 7 views

答えて

3

.は、sourceのエイリアスです。コマンドラインでファイルを直接入力した場合と同じように、現在のbashプロセスの引数であるファイルを実行します。

./fileはファイルへのパスを提供しています。その場合、ファイルはファイルのタイプに従って、またはテキストファイルの場合はそのhashbangに従って、サブプロセスとして起動されます。ファイルの最初の行が#!/bin/bashの場合、新しいbashプロセスとして起動します。

./ここにファイルが現在のディレクトリにあると表示されます。 cd /bin ; ./lsと言っても、/bin/lsというだけの違いはありません(明らかに、現在のディレクトリを1つではなく他のディレクトリではなく変更しています)。現在のディレクトリを指定する必要があり、単にファイルの名前を与えることができない理由は、ディレクトリが指定されていなければ、bashはPATH内で実行するプログラムのみを検索し、現在のディレクトリはUnixのようなPATHシステム。 /binはPATHにあるため、lsは(通常)/bin/lsと等価です。

変数を定義したい場合、その違いはかなりわかります。環境変数は現在のプロセスとそのサブプロセスにのみ存在します。したがって、サブプロセスで環境変数を定義すると、呼び出し元プロセスはそのサブプロセスにアクセスできなくなります。

たとえば、あなたは、ファイルがtestvar.shと呼ばれる持っているとしましょう:

#!/bin/bash 

what=world 

あなたがこれを行う場合は、変数を設定していません。

./testvar.sh ; echo Hello, $what 
# => Hello, 

をしかし、あなたがこれを行う場合、あなた次のようになります。

. testvar.sh ; echo Hello, $what 
# => Hello, world 

もう1つの明らかな違いは、.がbash coそれはbashスクリプトを含むファイルでのみ動作します。したがって、cd /bin ; ./lslsプログラムを実行します。 cd /bin ; . lsはエラーで失敗します。

関連する問題