回答:
シェルからスクリプトを実行している場合、この回答で#!/bin/sh
説明されているように、実際にシバンは必要ありません。OSXを含む、私が使用したすべてのUnixライクシステムは、インタープリターが特に指定されていない場合のデフォルトになります(ただし、シバンを与えない限り、非シェルはスクリプトの実行方法を知らないので、それは良い考えです。/bin/sh
また、.sh
拡張機能は必要ありません。あなたはやる、などを実行権限を設定する必要が
$ chmod +x script.sh
(これ$
はシェルプロンプトです。対話型シェルに与えるコマンドを説明するために使用しています。入力しないでください!)
ただし、混乱は、たとえばscript.sh
現在のディレクトリにスクリプトを作成し、単にを入力して実行しようとしていることだと思いますscript.sh
。例えば
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
(-を^D
意味します。この表記は、Unixの使用に関する多くの記事に記載されています。)controlD
script.sh
この場合、シェルスクリプトであるという事実は、問題の半分にすぎません。実際の問題は、デフォルトでは、シェルがプログラムの現在のディレクトリを検索しないことです。ただし、これは機能します。
$ sh script.sh
hello, world
なぜならsh
スクリプトを引数として取っているからです。
あなたは、再び、スクリプトを-または実行することができます任意のそれは(すなわち、実行可能とマークされている場合、現在のディレクトリに実行可能ファイルを、chmod +x
)あなたは現在のディレクトリ内のいずれかを実行することを指定することで、:
$ ./script.sh
hello, world
スクリプトをのディレクトリに移動することもできますPATH
。/usr/local/bin
スクリプトがシステム全体で使用されることを意図している場合はこれをお勧めします。スクリプトがbin
自分専用の場合は自宅のディレクトリを使用することをお勧めします。後者の場合、ホームディレクトリのに次の行を追加して$HOME/bin
、新しいbinディレクトリに展開するを追加する必要があります。PATH
.profile
PATH=$HOME/bin:$PATH
export PATH
最後に、必要に応じて、実際に現在のディレクトリをに追加PATH
することができます。これにより、script.sh
-または他の実行可能ファイルを含むディレクトリに移動し、次のように入力できます。
$ script.sh
実行します。しかし、私はこの方法はお勧めしません。攻撃者は今(、たとえば、という名前の実行可能スクリプトをドロップすることで、任意の実行可能ファイルを実行にあなたをだますことができますように、ls
あなたがになりますディレクトリに)。あなたがいる場合、実際にそれをやりたい、けれども、に次を追加するだけ.profile
です:
PATH=.:$PATH
export PATH
sl
、lls
またはl
...のようなものを心配する必要があります...すなわち、タイプミス。そのままに.
しておき$PATH
ます。また、システム上の全員を必ずしも信頼する必要はありません(または信頼すべきではありません)。例えば、そこにいくつかは、それは、攻撃者がいくつかのディレクトリに任意のファイルをドロップすることができます悪用し、彼らが必要だとし、あなたをより良いにエスカレートするために、そのファイルを実行するために利用する(例えば、収集データと携帯電話の家)。徹底的な防御!
/tmp
他の誰でも書き込み可能なディレクトリに残しておくことができます。
/tmp
等。領土が付属しています。
sh
スクリプトファイルが実行可能としてマークされている場合は、呼び出す必要はありません。その場合、既存のシェルから他のコマンドを実行するのと同じように、私の名前で呼び出すことができます。
完全に適切であるために、あなたは2つのことをしたいでしょう:
スクリプトを編集して、スクリプトの先頭にshebangディレクティブを含めます。
#!/bin/sh
...これにより、スクリプトの実行に使用するインタープリターがシェルに通知されます。この場合、/bin/sh
実行可能ファイル。
chmodコマンドを使用して、スクリプトを実行可能としてマークします。
chmod u+x scriptname.sh
両方を実行すると、コマンドラインにスクリプトのファイル名を入力して、スクリプトを実行できるようになります。含まれるフォルダーをPATH変数に追加するという追加の手順を実行しない限り、スクリプトと同じディレクトリにいる必要があります。どのシェルがスクリプトを実行するかを気にしない場合、ステップ1を指定する必要はありませんが、sh
正確に「shebangsh」を設定する方が良い場合がよくあります。
/bin/sh
はありませんが、痛みはありません。
ksh
HP-UX でスクリプトを書いていたので、私の習慣は常に指定することでしたが、厳密に必要ではないことを知っているのは良いことです。
exec
システムコールを、あなたが取得するENOEXEC
(execのフォーマットエラーを)。すみません、@ bmike、@ ChrisW.Rea。今すぐ答えを編集しに行きます。