Unix コンソールまたは Mac ターミナルでシェル スクリプトを実行するにはどうすればよいでしょうか? 質問する

Unix コンソールまたは Mac ターミナルでシェル スクリプトを実行するにはどうすればよいでしょうか? 質問する

知ってはいるが、忘れてしまい、もう一度学び直す。書き留める時間だ。

ベストアンサー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 番目の引数として)。

つまり、実行可能なスクリプトにはすべてハッシュバン が必要です。ハッシュバン がない場合、カーネルに を伝えていないことになりカーネルは を解釈するためにどのプログラムを使用すればよいかわかりません。bashperlpythonsh、または他のプログラムである可能性があります。(実際には、カーネルは多くの場合、ユーザーのデフォルト シェルを使用してファイルを解釈しますが、これは非常に危険です。なぜなら、適切なインタープリターではない可能性があり、一部は解析できても と の場合のように微妙な動作の違いがある可能性があるからです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行うことができる というプログラムがあります。幸い、ほぼすべてのシステムには というプログラムがインストールされています。そこで、ハードコードされたパスを使用してを検索し、それを実行してスクリプトを解釈できるようにします。PATHenvenv/usr/binenvPATHbash

#!/usr/bin/env bash

このアプローチには欠点が 1 つあります。POSIX によれば、ハッシュバンは1 つの引数を持つことができます。この場合、 をプログラムbashの引数として使用しますenv。つまり、 に引数を渡すためのスペースが残っていないということですbash。したがって、 のようなものをこのスキームに変換する方法はありません。代わりに、ハッシュバンの後に#!/bin/bash -exuを配置する必要があります。set -exu

このアプローチには、別の利点もあります。システムによっては が付属している場合もあります/bin/bashが、ユーザーがそれを気に入らなかったり、バグがあったり、古くなったりして、別の場所に独自の bash をインストールしている可能性があります。これは、Apple が古い を出荷し、ユーザーが Homebrew などを使用して最新の をインストールするbashOS X (Mac) でよくあるケースです。検索を行う のアプローチを使用すると、ユーザーの好みが考慮され、システムに付属している bash ではなく、ユーザーの好みの bash が使用されます。/bin/bash/usr/local/bin/bashenvPATH

おすすめ記事