スクリプトを実行する方法はいくつかあります。私が知っていることは:
/path/to/script # using the path (absolute or relative)
. script # using the . (dot)
source script # using the `source` command
別の方法がありますか?それらの違いは何ですか?他の代わりに1つを使用する必要がある状況はありますか?
ベストアンサー1
別の方法は、インタプリタを呼び出してスクリプトパスを渡すことです。
/bin/sh /path/to/script
ポイントとソースは同じです。 (編集:いいえ、そうではありません。KeithBが他の答えの説明で指摘したように、「.」はbash関連のシェルにのみ適用され、「source」はbashとcsh関連のシェルに適用されます。) -place(そこにスクリプトをコピーすると貼り付けたのと同じです。)これは、スクリプト内のすべての関数と非ローカル変数が保存されることを意味します。これは、スクリプトがディレクトリにCDを保存している場合、操作が完了してもまだその場所にあることを意味します。
スクリプトを実行する別の方法は、独自のサブシェルで実行することです。完了後、スクリプトの変数は無効になります。スクリプトがディレクトリを変更しても、呼び出し環境には影響しません。
/path/to/script と /bin/sh スクリプトは少し異なります。通常、スクリプトの先頭には次のように「shebang」があります。
#! /bin/bash
これはスクリプトインタプリタのパスです。実行時に指定したものと異なるインタプリタを指定すると、動作が異なる場合があります(またはまったく動作しない場合があります)。
たとえば、PerlスクリプトとRubyスクリプトは次のように始まります。
#! /bin/perl
そして
#! /bin/ruby
を実行してこれらのスクリプトのいずれかを実行すると、/bin/sh script
まったく動作しません。
Ubuntuは実際にbashシェルを使用しませんが、dashという非常に似たシェルを使用します。 bashを必要とするスクリプトは/bin/sh script
ダッシュソルバーを使用してbashスクリプトを呼び出したため、doを介して呼び出すと少し間違っている可能性があります。
スクリプトを直接呼び出すこととスクリプトパスをインタプリタに渡すことのもう1つの小さな違いは、スクリプトをインタプリタにパスを渡して実行するのではなく、直接実行できるように実行可能としてマークする必要があることです。
別の小さな変更:スクリプトを実行するすべてのメソッドに対してevalをプレフィックスとして使用できます。
eval sh script
eval script
eval . script
など。実際には何も変わりませんが、徹底的に含めたいと思いました。