「bash script.sh」と「./script.sh」の実行の違いは何ですか?


42

script.shが典型的なものである場合

#!/bin/bash
echo "Hello World!"

スクリプトを実行する好ましい方法はありますか?実行可能になるように、最初にchmodする必要があると思いますか?

回答:


56

特定のスクリプトで./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.shbash通常のファイルとしてのみ読み取られるため、実行ビットは不要です。


./script.shただし、スクリプトに必要なインタープリターがわからない場合があるため、使用することをお勧めします。したがって、プログラムローダーにそれを判断させます。


3
実行可能ビットが設定されていない場合は、「。./script.sh」を実行してスクリプトを実行することもできます
犬が猫の世界を食べる

1
@Dogあなたは正しいです。ドットは、現在のbashプロセスでスクリプトを実行する組み込みコマンド「source」のショートカットです。したがって、読み取り可能なビットのみが必要です。
スカイダン14年

5
@Dogeatcatworld真の間、実行されているが、. ./script.sh同じものではありませんbash script.sh(または./script.shスクリプト考えてみましょう。#!/usr/bin/python -V<改行>をprint test
ケーシー

12
スクリプトを入手すると、インタラクティブセッションが汚染される可能性があることに注意してください。たとえば、スクリプトがPATH環境変数を変更した場合、この変更はソースに従って実行されるコマンドに影響します。このアプローチは、副作用(環境設定スクリプトなど)に依存する状況のために実際に予約する必要があります。アクセス許可を変更できない他の状況では、スクリプト名に続けてshebang行でコマンドを実行するのが最も安全な方法です。
ctt 14年

6
現在のディレクトリでスクリプトをソースする場合、。/を使用する必要がないことに注意してください。ただ言う. script.sh。しかし、.そのように呼び出されることを意図していないスクリプトでコマンドを使用することを思いとどまらせる人々には同意します。スクリプトにexitコマンドが含まれていて、それを入手した場合、ログアウトされる可能性があると誰も言及していないことに驚いています。スクリプトがを実行する場合はcd、親(インタラクティブ)シェルにも影響するため、それほど深刻な問題はありません。
スコット14年

18

bash script.shbashを使用してスクリプトを直接呼び出します。実行方法を決定するために
./script.shシバン#!/bin/bashを使用しています。

本当に知りたい場合は、を実行すると、どのバイナリが実行されるかbash script.shがわかりますwhich bash

したがって、例では違いはありません。はい、chmod +x script.sh経由で直接実行できる必要があります./script.sh


2
まあ、それがあなた/bin/bashの最初のものbashであると仮定しても違いはありません$PATH
cjm 14年

あなたが正しい。そしてシェバングが#!/bin/bash存在する場合にのみ働いている/bin/bash
xx4h

私のシステムのBash(バージョン4.2.37)は、実行ビットが設定されていなくてもスクリプトを実行します。なぜ実行ビットが必要だと言うのですか?
SkyDan 14年

はい、実行ビットはを介して呼び出す場合にのみ必要です./script.sh
xx4h 14年

4

次のようなファイル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

素敵な例の+1
ThisaruG

1

他の回答に加えて、./script.sh(i)とソース./script.sh(ii)を介してスクリプトを実行することの違いを知ることは有用です-(i)バージョンはコマンドを実行する新しいシェルを作成しますが、(ii)現在のシェル-実行可能ファイルが終了した後に保存する必要がある環境変数を実行可能ファイルが変更する場合、これは必須です。たとえば、Python conda環境をアクティブにするには、次を使用する必要があります。

source activate my_env

NB sourceあなたが遭遇するかもしれないそれへのもう一つの代替は.組み込みです、すなわち

. activate my_env
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.