知ってはいるが、忘れてしまい、もう一度学び直す。書き留める時間だ。
ベストアンサー1
実行可能でないsh
スクリプトを実行するには、次を使用します。
sh myscript
実行可能でないbash
スクリプトを実行するには、次を使用します。
bash myscript
実行可能ファイル(実行権限を持つファイル)を起動するには、パスを指定するだけです。
/foo/bar
/bin/bar
./bar
スクリプトを実行可能にするには、必要な権限を付与します。
chmod +x bar
./bar
ファイルが実行可能である場合、カーネルはそれをどのように実行するかを判断する責任があります。非バイナリの場合、これはファイルの最初の行を見て行われます。そこには次の内容が含まれている必要がありますhashbang
:
#! /usr/bin/env bash
ハッシュバンはカーネルにどのプログラムを実行するかを指示します (この場合、コマンドは/usr/bin/env
引数 で実行されますbash
)。次に、スクリプトは、スクリプトに後続の引数として指定したすべての引数とともに、プログラムに渡されます (2 番目の引数として)。
つまり、実行可能なスクリプトにはすべてハッシュバン が必要です。ハッシュバン がない場合、カーネルに を伝えていないことになり、カーネルは を解釈するためにどのプログラムを使用すればよいかわかりません。bash
、perl
、python
、sh
、または他のプログラムである可能性があります。(実際には、カーネルは多くの場合、ユーザーのデフォルト シェルを使用してファイルを解釈しますが、これは非常に危険です。なぜなら、適切なインタープリターではない可能性があり、一部は解析できても と の場合のように微妙な動作の違いがある可能性があるからですsh
) bash
。
注記/usr/bin/env
最も一般的なハッシュバンは次のようなものです:
#!/bin/bash
その結果、カーネルは/bin/bash
スクリプトを解釈するためにプログラムを実行します。残念ながら、bash
は必ずしもデフォルトで出荷されるとは限らず、で常に使用できるとは限りません。Linux マシンでは通常デフォルトで出荷されますが、やなど、さまざまな場所で出荷される/bin
他の POSIX マシンも多数あります。bash
/usr/xpg/bin/bash
/usr/local/bin/bash
したがって、移植可能な bash スクリプトを書くには、プログラムの場所をハードコーディングする必要はありませんbash
。POSIX には、これを処理するためのメカニズムが既にありますPATH
。その考え方は、プログラムを のディレクトリの 1 つにインストールしPATH
、名前でプログラムを実行したいときにシステムがプログラムを見つけられるようにすることです。
残念ながら、次のようにすることはできません。
#!bash
カーネルはあなたに代わって検索を行いません (行う場合もあります) 。ただし、あなたに代わって検索をPATH
行うことができる というプログラムがあります。幸い、ほぼすべてのシステムには というプログラムがインストールされています。そこで、ハードコードされたパスを使用してを検索し、それを実行してスクリプトを解釈できるようにします。PATH
env
env
/usr/bin
env
PATH
bash
#!/usr/bin/env bash
このアプローチには欠点が 1 つあります。POSIX によれば、ハッシュバンは1 つの引数を持つことができます。この場合、 をプログラムbash
の引数として使用しますenv
。つまり、 に引数を渡すためのスペースが残っていないということですbash
。したがって、 のようなものをこのスキームに変換する方法はありません。代わりに、ハッシュバンの後に#!/bin/bash -exu
を配置する必要があります。set -exu
このアプローチには、別の利点もあります。システムによっては が付属している場合もあります/bin/bash
が、ユーザーがそれを気に入らなかったり、バグがあったり、古くなったりして、別の場所に独自の bash をインストールしている可能性があります。これは、Apple が古い を出荷し、ユーザーが Homebrew などを使用して最新の をインストールするbash
OS X (Mac) でよくあるケースです。検索を行う のアプローチを使用すると、ユーザーの好みが考慮され、システムに付属している bash ではなく、ユーザーの好みの bash が使用されます。/bin/bash
/usr/local/bin/bash
env
PATH