ソース(「。」または「ソース」)とbashでファイルを実行することの違いは何ですか?


76

このようなスクリプトの実行の違いは何ですか:

./test.sh

次のようなスクリプトを実行します。

. test.sh

簡単な2行のスクリプトを試して、違いがあるかどうかを確認しました。

#!/bin/bash
ls

しかし、両方とも同じ情報. test.sh./test.sh返しました。


これが重複している場合はおologiesびします。さらに調査すると、「bash。」ではなく「bash dot」を検索して、関連情報のあるページを見つけました。
ナタン

3
同じようにtest.shと同じではありません./test.sh(最初の呼び出しPATH検索を)ので、ある. test.sh. ./test.sh同じ方法で異なる(前者は呼び出しPATH検索を)。多くのシェルは、パス検索を行う際.の最後に暗黙的に含まれているようですが、この動作は標準ではありません。したがって、vs とvs を比較する方がより正確です。PATH.test.sh. test.sh./test.sh. ./test.sh
jw013

回答:


83

./test.shtest.sh別のプログラムとして実行されます。ファイルtest.shがで始まる場合、bashスクリプトである可能性があります#!/bin/bash。しかし、それはまったく別の何かかもしれません。

. ./test.shtest.shbashの実行中のインスタンス内でファイルのコードを実行します。コンテンツファイルtest.sh. ./test.sh行の代わりにテキストで含まれているかのように機能します。(ほとんど:の値$BASH_LINENOreturn組み込みの動作など、異なるいくつかの詳細があります。)

source ./test.sh. ./test.shbash と同じです(他のシェルでsourceは、わずかに異なるか、まったく存在しない可能性があります。.含めるためには、POSIX標準に含まれます)。

組み込みの./test.shスクリプトを使用して個別のスクリプトを実行することと含めることの最も一般的な違いは.test.shスクリプトがいくつかの環境変数を個別のプロセスで設定する場合、子プロセスの環境のみが設定されるのに対して、スクリプトを含めると環境唯一のシェルプロセスの あなたが行を追加する場合foo=bartest.shecho $foo呼び出し元のスクリプトの最後に、あなたは違いが表示されます:

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar

17
またecho $$、スクリプトに追加すると、違いが非常に明確になります。$$変数は、現在のシェルのPIDを保持しています。

1
別の使用シナリオは、. ./test.sh別のシェルスクリプト内からの呼び出しを使用して、test.sh内に記述されている関数を使用することです。つまり、設定できるのは変数だけではなく、この方法で新しい関数を作成して、bashまたは他のスクリプトから呼び出すこともできます。. /usr/libexec/company/tools; custom_command "variable"
-Rqomey

9

最初の方法でスクリプトを実行すると、子プロセスとして実行されます。一方、ソーシング(2番目の方法)は、すべてのコマンドを現在のシェルに入力したかのようにスクリプトを実行します。スクリプトが変数を設定すると、設定されたままになり、スクリプトが終了すると、セッションが終了します。help .ドキュメントを参照してください。


3

もう1つ注意すべき点は、次のようなエイリアスがある場合です。

# add into .bashrc_aliases
alias ls='ls -lht'

./test.shあなたが通常得るでしょうls出力(および現在のシェルとは異なるPIDを):

auraham@pandora:~/iso$ ./test.sh 
dsl-4.4.10.iso  test.sh
3136 # PID

. test.sh. ./test.sh、あなたは、より詳細な出力(および現在のシェルと同じPID)を取得します:

auraham@pandora:~/iso$ echo $$
2767 # shell PID

auraham@pandora:~/iso$ . test.sh 
total 50M
drwxrwxr-x  2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x  1 auraham auraham   32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r--  1 auraham auraham  50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID

これを含めることができます。.bashrc if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi 次に、エイリアスをに入れます.bash_aliases
オーラハム

もちろん、aliasキーワードを使用する必要はありませんか?(たぶんそれはあなたの投稿の間違いでしょう-3行目?)
エマニュエルベルク

完全に正しい、私の間違い。ありがとう@EmanuelBerg
オーラハム

-1

source(または.)私の主な使用法はbash関数です。

私は多くの機能を備えたスクリプトを持ってい.bashrcます。私がよく使用する関数はコマンドに「なります」。


ソース、スクリプトの絶対位置、およびコマンドの名前(PATHフォルダーにスクリプトを配置)で、.bashrcの3つのメソッドすべてを試しましたが、3つのメソッドはすべて機能しました。
エマニュエルベルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.