.shファイルを実行する前にshを置く必要があるのはなぜですか?


16

.shターミナルでファイルを実行するときは、ファイルのsh前に配置する必要があります。

これを回避する方法はありますか?


3
〜/ binにフォルダーを作成して、シェルスクリプトを$ PATHに配置し、フォルダーアクションを〜/ binフォルダーに添付して、実行権限を自動的に設定します。
カイデル

回答:


22

シェルからスクリプトを実行している場合、この回答で#!/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

置く '。' $ PATHの先頭ではなく末尾で、ファントム「ls」について心配する必要はありません。(誰かがあなたのシステムに入ることができる場合、あなたはより大きな問題を抱えています。)
TJルオマ

2
@TJ、しかし、あなたslllsまたはl...のようなものを心配する必要があります...すなわち、タイプミス。そのままに.しておき$PATHます。また、システム上の全員を必ずしも信頼する必要はありません(または信頼すべきではありません)。例えば、そこにいくつかは、それは、攻撃者がいくつかのディレクトリに任意のファイルをドロップすることができます悪用し、彼らが必要だとし、あなたをより良いにエスカレートするために、そのファイルを実行するために利用する(例えば、収集データと携帯電話の家)。徹底的な防御!
リード

@TJLuoma @Reidが言ったことに加えて、個人のOS Xデスクトップ以外にもUni​​xシステムには多くのユースケースがあることに留意してください。試したことはありませんが、ゲストアカウントでさえ、これらのアイテムの1つを/tmp他の誰でも書き込み可能なディレクトリに残しておくことができます。
zigg

他の人が使用するディレクトリにアクセスできるシステムを使用している場合、より大きな問題が発生します。
TJルオマ

@TJLuomaその場合、Unixシステムで複数のアカウントを使用することはできません。 /tmp等。領土が付属しています。
-zigg

10

shスクリプトファイルが実行可能としてマークされている場合は、呼び出す必要はありません。その場合、既存のシェルから他のコマンドを実行するのと同じように、私の名前で呼び出すことができます。


完全に適切であるために、あなたは2つのことをしたいでしょう:

  1. スクリプトを編集して、スクリプトの先頭にshebangディレクティブを含めます。

    #!/bin/sh

    ...これにより、スクリプトの実行に使用するインタープリターがシェルに通知されます。この場合、/bin/sh実行可能ファイル。

  2. chmodコマンドを使用して、スクリプトを実行可能としてマークします。

    chmod u+x scriptname.sh

両方を実行すると、コマンドラインにスクリプトのファイル名を入力して、スクリプトを実行できるようになります。含まれるフォルダーをPATH変数に追加するという追加の手順を実行しない限り、スクリプトと同じディレクトリにいる必要があります。どのシェルがスクリプトを実行するかを気にしない場合、ステップ1を指定する必要はありませんが、sh正確に「shebangsh」を設定する方が良い場合がよくあります。


シバンは、実際には必要で/bin/shはありませんが、痛みはありません。
-zigg

@zigg-あなたは正しいです。クリスが私の編集を気にしないことを願っています...必要に応じて

@bmike編集は私のために働きます。シバンについては、kshHP-UX でスクリプトを書いていたので、私の習慣は常に指定することでしたが、厳密に必要ではないことを知っているのは良いことです。
クリスW.レア

1
私はあなたがシェルからシェバングレススクリプトを実行することができます(。私の答えの残りの部分はまだ立っているが)、私はシェバング必要性についての私の以前のステートメントから離れてバックアップする必要があると思いますが、あなたが使用している場合はexecシステムコールを、あなたが取得するENOEXEC(execのフォーマットエラーを)。すみません、@ bmike、@ ChrisW.Rea。今すぐ答えを編集しに行きます。
zigg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.