script.shが次のような典型的なものである場合
#!/bin/bash echo "Hello World!"
優先されるものはありますかスクリプトを実行する方法は?実行可能になるように最初にchmodする必要があると思いますか?
回答
特定のスクリプトでは、どちらの方法でも機能します。 ./script.sh
には実行可能ビットと読み取り可能ビットが必要ですが、bash script.sh
には読み取り可能ビットのみが必要です。
理由権限要件の違いは、スクリプトを解釈するプログラムのロード方法にあります。
-
./script.sh
は、シェルにファイルを通常のように実行させます。実行可能ファイル。
シェルはそれ自体をフォークし、システムコール(execve
など)を使用して、フォークされたプロセスでオペレーティングシステムにファイルを実行させます。オペレーティングシステムはファイルのパーミッションをチェックし(したがって実行ビットを設定する必要があります)、ファイルを参照するプログラムローダーにリクエストを転送しますLinuxでは、コンパイルされた実行可能ファイルは ELF マジックナンバーで始まり、スクリプトは#!
( hashbang )。hashbangヘッダーは、ファイルがスクリプトであり、hashbangの後に指定されたプログラムによって解釈される必要があることを意味します。これによりスクリプトが許可されますスクリプトの解釈方法をシステムに指示します。
スクリプトを使用すると、プログラムローダーは/bin/bash
を実行し、./script.sh
をコマンドライン引数として使用します。
-
bash script.sh
を使用すると、シェルがbash
を実行して渡されます。script.sh
をコマンドライン引数として
したがって、オペレーティングシステムは(script.sh
はコマンドライン引数にすぎないため、見ていません)。作成されたbash
プロセスは、コマンドライン引数として渡されるため、script.sh
を解釈します。script.sh
はbash
によって通常のファイルとしてのみ読み取られ、実行ビットは必要ありません。
ただし、スクリプトに必要なインタープリターがわからない場合があるため、プログラムローダーに判断させてください。
コメント
- 実行可能ビットが設定されていない場合は、"を実行してスクリプトを実行することもできます。./script.sh"
- @Dog正解です。ドットは組み込みコマンド' source 'のショートカットです。 、現在のbashプロセスでスクリプトを実行します。したがって、読み取り可能なビットのみが必要です。
- @Dogeatcatworldそれが当てはまる場合、
. ./script.sh
の実行は同じではありません。 (または./script.sh
。スクリプト#!/usr/bin/python -V
< newline >print test
。 - スクリプトを調達すると、インタラクティブセッションが汚染される可能性があることに注意してください。たとえば、スクリプトがPATH環境変数を変更した場合、この変更はソースの後に実行されるコマンドに影響します。このアプローチは、副作用(環境設定スクリプトなど)に依存する状況のために実際に予約する必要があります。 '権限を変更できないその他の状況では、シバン行でコマンドを実行し、スクリプト名を続けるのが最も安全な方法です。
- 注意してください。 、現在のディレクトリでスクリプトを入手する場合は、 ./ を使用する必要はありません。
. script.sh
とだけ言ってください。しかし、そのように呼び出されることを意図していないスクリプトで.
コマンドを使用することを思いとどまらせる人々に同意します。スクリプトにexit
コマンドが含まれていて、それをソースにすると、ログアウトする可能性があると誰も言っていないことに驚いています。スクリプトがcd
を実行すると、親(対話型)シェルにも影響するため、それほど深刻な問題は発生しません。
回答
bash script.sh
はbashを使用してスクリプトを直接呼び出します。
./script.sh
は、シバン#!/bin/bash
を使用して実行方法を決定しています。
本当に知りたい場合は、bash script.sh
which bash
で見つけることができます。
したがって、この例では違いはありません。はい、./script.sh
を介して直接実行するには、chmod +x script.sh
する必要があります。
コメント
。
#!/bin/bash
は、/bin/bash
./script.sh
を介して呼び出すことによってのみ必要です。回答
次のようにDelete_Self.shファイルを作成します:
#!/bin/rm echo I am still here!
これを実行しますスクリプトをsh Delete_Self.sh
とすると、「私はまだここにいます!」と表示されます。エコーバック。
実行可能ファイルにして、./Delete_Self.sh
として実行すると、ファイルDelete_Self.sh
自体はなくなりました。
違いは次のとおりです。
-
bash script.sh
は#を無視します!これは、script.shを実行するプログラムとしてbashが指定されているためです。 -
./script.sh
は#!script.sh
を実行するプログラムを決定する行。
コメント
- +1 for良い例
回答
他の回答に加えて、<を介してスクリプトを実行することの違いを知っているdiv id = "e19f690f24">
(i)およびソース./script.sh
(ii)は便利です-(i)バージョンは、コマンドを実行するための新しいシェルを作成します。一方、(ii)は現在のシェルで実行します。これは、実行可能ファイルが終了後に保持する必要のある環境変数を実行可能ファイルが変更する場合に必須になる可能性があります。たとえば、python conda環境をアクティブ化するには、次を使用する必要があります。
source activate my_env
N.B。遭遇する可能性のあるsource
のもう1つの代替手段は、.
ビルトイン、つまり
. activate my_env
/bin/bash
が最初のivid =であると仮定しても、違いはありません。$PATH
の “0af2cf6b78″>