回答:
特定のスクリプトで./script.sh
は、実行と読み取り可能なビットが必要ですが、読み取り可能なビットbash script.sh
のみが必要な場合を除き、どちらの方法でも機能します。
許可要件の違いの理由は、スクリプトを解釈するプログラムのロード方法にあります。
./script.sh
シェルにファイルを通常の実行可能ファイルのように実行させます。シェルはそれ自体をフォークしexecve
、オペレーティングシステムにフォークされたプロセス内のファイルを実行させるためにシステムコール(例:)を使用します。オペレーティングシステムは、ファイルのアクセス許可を確認し(したがって、実行ビットを設定する必要があります)、要求をプログラムローダーに転送します。Linuxでは、コンパイルされた実行可能ファイルはELFマジックナンバーで始まり、スクリプトは#!
(hashbang)で始まります。hashbangヘッダーは、ファイルがスクリプトであり、hashbangの後に指定されたプログラムによって解釈される必要があることを意味します。これにより、スクリプト自体がシステムにスクリプトの解釈方法を伝えることができます。
スクリプトを使用する/bin/bash
と、プログラムローダーが実行さ./script.sh
れ、コマンドライン引数として渡されます。
bash script.sh
シェルを実行し、コマンドライン引数としてbash
渡しscript.sh
ますそのため、オペレーティングシステムが読み込まれますbash
(これはscript.sh
単なるコマンドライン引数であるため、を見ていません)。作成されたbash
プロセスはscript.sh
、コマンドライン引数として渡されるため、解釈されます。script.sh
はbash
通常のファイルとしてのみ読み取られるため、実行ビットは不要です。
./script.sh
ただし、スクリプトに必要なインタープリターがわからない場合があるため、使用することをお勧めします。したがって、プログラムローダーにそれを判断させます。
. ./script.sh
同じものではありませんbash script.sh
(または./script.sh
スクリプト考えてみましょう。#!/usr/bin/python -V
<改行>をprint test
。
. script.sh
。しかし、.
そのように呼び出されることを意図していないスクリプトでコマンドを使用することを思いとどまらせる人々には同意します。スクリプトにexit
コマンドが含まれていて、それを入手した場合、ログアウトされる可能性があると誰も言及していないことに驚いています。スクリプトがを実行する場合はcd
、親(インタラクティブ)シェルにも影響するため、それほど深刻な問題はありません。
bash script.sh
bashを使用してスクリプトを直接呼び出します。実行方法を決定するために
./script.sh
シバン#!/bin/bash
を使用しています。
本当に知りたい場合は、を実行すると、どのバイナリが実行されるかbash script.sh
がわかりますwhich bash
。
したがって、例では違いはありません。はい、chmod +x script.sh
経由で直接実行できる必要があります./script.sh
。
/bin/bash
の最初のものbash
であると仮定しても違いはありません$PATH
。
#!/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
#!は無視されます これは、bashがscript.shを実行するプログラムとして指定されているためです。./script.sh
#を読み取ります!実行するプログラムを決定する行script.sh
。他の回答に加えて、./script.sh
(i)とソース./script.sh
(ii)を介してスクリプトを実行することの違いを知ることは有用です-(i)バージョンはコマンドを実行する新しいシェルを作成しますが、(ii)現在のシェル-実行可能ファイルが終了した後に保存する必要がある環境変数を実行可能ファイルが変更する場合、これは必須です。たとえば、Python conda環境をアクティブにするには、次を使用する必要があります。
source activate my_env
NB source
あなたが遭遇するかもしれないそれへのもう一つの代替は.
組み込みです、すなわち
. activate my_env