web-dev-qa-db-ja.com

違いは何ですか '。'とシェルの「ソース」?

可能性のある複製:
「。」と「ソース」を使用してスクリプトを実行

ドットコマンド「。」の両方を使用しました。与えられたrcファイルをリロードするための「ソース」(通常は環境変数を更新するため)。 2つの違いは何ですか?

13
Ivar

.はBourne and POSIX Shellコマンドで、sourceはC-Shellコマンドです。

bashzshのような一部のBourne-Shell派生物、およびkshのほとんどの実装には、sourceコマンドがあり、これは通常.のエイリアスです。ただし、違いのあるkshの場合。

Bashとzshの場合、.sourceは同じように動作しますが、それらの動作は、POSIXモードで実行するかどうかによって影響を受けます¹。

POSIXは、読み取りのためにファイルを開くことができない場合は.コマンドがシェルを終了することを要求し、提供されたパスが含まれていない場合は$PATHのディレクトリを検索してファイルを見つける必要があります/

zshとbash .sourceは、POSIXモードではPOSIXが必要とするように動作し、そうでない場合はpdkshのsourceと同様に動作します。つまり、開くことができない場合、スクリプトを終了しません。読み取り用のファイル(command .と同じ)。$PATHおよび現在のディレクトリでファイルを検索します。指定されたパスに/が含まれていない場合。

AT&T kshのsourceもシェルを終了しませんが、現在のディレクトリでファイルを探しません。

概して、Bourneに似たシェル(commandが組み込まれていないBourne Shellは除く)では、一貫した動作が必要な場合は、

command . the-file-to-source || handle-error

the-file-to-sourceが現在のディレクトリにあることを意図している場合は、必ず次のように記述してください:

command . ./the-file-to-source || handle-error

shスクリプト(shはPOSIX shです)では、上記のPOSIXの動作に依存できるはずです。


_ zshおよびbashは、shとして呼び出されたときにPOSIXモードを有効にします。 bashの場合、環境でPOSIXLY_CORRECTを受け取ったとき(POSIXコマンドbashがないにもかかわらずbashとして呼び出されたときも)、またはSHELLOPTS=posixを受け取ったとき、またはbash --posixまたはbash -o posixを使用して、またはset -o posixの後に呼び出された場合。 zshでは、emulate shを使用してエミュレートshします。エミュレーションは、zshの動作を変更する一連のオプション全体を変更します。この場合、オプションはPOSIX_BUILTINSです。

Bashでは、(非POSIX)の[ -o posix ]コマンドを使用して、POSIXモードかどうかを確認できます。 zshでは、emulateの出力を確認してshエミュレーションにいるかどうかを確認するか、[[ -o posixbuiltins ]]を使用してその特定のオプションが有効になっているかどうかを確認します。 emulate -Lを使用して、特定のエミュレーションモードを一時的に有効にすることもできます(現在のlocalスコープでのみエミュレートするため)。

27

sourceは、読みやすさと自己文書化のためにあります。.は入力が簡単なために存在しています。コマンドは同じです。 Perlには、同じ理由で、制御変数の多くの長いバージョンと短いバージョンがあります。

1
Kyle Jones