Linux システムでは、これら 2 つの異なる方法で script.sh をキックすることに違いはありますか?
それらはまったく同じものですか?
ありがとう
./script.sh は、このファイルが現在のディレクトリにあり、実行ビットが設定されており、ファイルの最初の行がインタープリターへのパスであると想定しています ( Shebang 行 )
bash script.sh は、bash を呼び出して、実行 (解釈) するファイルの内容を bash コマンドとして渡すことを意味します。この方法では、ファイルを実行可能にする必要はなく、シバン行があります。
./script.sh の条件が満たされている場合、両方の呼び出しで同じ結果が得られます。
最初の形式が機能するためには、ファイルに実行可能ビットが設定されている必要があります。次に、使用されるインタープリターを指定するシバンが必要です。
そうです、両方の形式は同じです (解釈されるものに関しては)。
歴史の教訓については、これを参照してください
Linux カーネルでの she-bang 解析の現在の実装については、こちらを参照してください。
これはまったく同じではないと思います。
私が理解している限りで./script.sh
は、現在のシェルでスクリプトを実行するだけです。実行しているbash(Bourne Again SHell)である必要はなく、システムにインストールされている任意のシェルにすることができます。
を使用してスクリプトを実行する場合はbash script.sh
、bashシェルを使用してスクリプトを明示的に実行するようにシステムに指示します。
次のコマンドを呼び出すことで、システムで使用可能なシェルを確認できます。
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
script.sh は、bully 内の Knittl の投稿で指摘されているように、script.anything と呼ぶことができます。スクリプトは次のように識別されます。
#!/whatever/it/is
bash ./script.something を実行するということは、bash を使用してスクリプトを実行するように指示することを意味し、実行するのではなくエラーを返す可能性があります。
#!/usr/bin/perl
script.sh という perl スクリプトを作成できます。
cat perl.sh
#!/usr/bin/perl
print "Hello World\n";
:~/Documents$ ./perl.sh
Hello World
~/Documents$ bash ./perl.sh
Warning: unknown mime-type for "Hello World\n" -- using "application/octet-stream"
Error: no such file "Hello World\n"
必ずしも同じではありません。
script.sh を実行すると、Linux は $PATH 環境変数に設定されたディレクトリを検索します。
./script.sh を使用すると、Linux は呼び出し時のディレクトリにあるスクリプトを実行します。