script.shが次のような一般的なものである場合
#!/bin/bash
echo "Hello World!"
スクリプトを実行するための好ましい方法はありますか?実行できるようにまずchmodを実行する必要があると思いますか?
答え1
特定のスクリプトでは./script.sh
、実行可能で読み取り可能なビットとbash script.sh
読み取り可能なビットのみが必要であることを除いて、両方のアプローチが機能します。
権限要件が異なる理由は、スクリプトを解釈するプログラムがロードされる方法です。
./script.sh
シェルにファイルを通常の実行可能ファイルと同じように実行させます。
シェルはそれ自体でフォークを実行し、システムコール(たとえばexecve
)を使用して、オペレーティングシステムにフォークされたプロセスでファイルを実行させます。オペレーティングシステムはファイルの権限を確認し(したがって実行ビットを設定する必要があります)、要求を次に転送します。プログラムローダー、ファイルを表示して実行する方法を決定します。 Linuxでコンパイルされた実行可能ファイルは次のように始まります。非常に低い周波数マジックナンバー、#!
マジックナンバーを含むスクリプト、(ハッシュスティック)。 hashbangヘッダーは、ファイルがスクリプトであり、hashbangの後に指定されたプログラムによって解釈される必要があることを意味します。これにより、スクリプト自体がシステムにスクリプトの解釈方法を伝えることができます。
スクリプトの場合、プログラムローダが実行され、/bin/bash
コマンドライン引数として渡されます。./script.sh
bash script.sh
シェルを実行し、コマンドライン引数としてbash
渡します。script.sh
したがって、OSがロードされます(単純なコマンドライン引数であるため、bash
見ていません)。script.sh
生成されたプロセスは、コマンドライン引数として渡されたかのようにbash
解釈されます。通常のファイルでのみ読み取るscript.sh
ため、実行ビットは不要です。script.sh
bash
./script.sh
ただし、スクリプトにどのインタプリタが必要かわからないため、使用することをお勧めします。したがって、プログラムローダーにこれを決定させるようにしてください。
答え2
bash script.sh
bashを使用してスクリプトを直接呼び出します。
./script.sh
Shebangは#!/bin/bash
実行方法を決定するために使用されます。
bash script.sh
どのバイナリが実行されるのか本当に知りたい場合はwhich bash
。
したがって、あなたのケースに違いはありません。はい、chmod +x script.sh
直接通過する必要があります./script.sh
。
答え3
次のように 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
。
答え4
他の答えに加えて、./script.sh
(i)とsource ./script.sh
(ii)を介してスクリプトを実行することの違いを知っておくと便利です。 - (i) バージョンはコマンドを実行するための新しいシェルを生成し、(ii) は現在のシェルで実行します。 - if実行可能ファイルが終了した後に保持する必要がある環境変数を実行可能ファイルが変更した場合は、コマンドが必須になる可能性があります。たとえば、Python conda 環境を有効にするには、次のコマンドを使用する必要があります。
source activate my_env
source
発生する可能性がある別のオプションが組み込ま.
れています。
. activate my_env