1. ホーム
  2. linux

[解決済み] UnixのコンソールやMacのターミナルでシェルスクリプトを実行するには?

2022-03-18 16:59:25

質問

知っているのに忘れて、また覚え直す。書き留めておく時間です。

解き方は?

非実行ファイルを実行するには 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 などがあります。 (実際には、カーネルはユーザのデフォルトのシェルを使ってファイルを解釈することが多いのですが、これは非常に危険なことです。 shbash ).

に関するメモ /usr/bin/env

最も一般的なのは、このようなハッシュバングを見ることです。

#!/bin/bash

その結果、カーネルはプログラムを実行することになります。 /bin/bash を実行して、スクリプトを解釈します。 残念ながら bash はデフォルトで出荷されているとは限らず、また /bin . Linux マシンでは通常そうですが、他の POSIX マシンでは bash など、様々な場所で出荷されています。 /usr/xpg/bin/bash または /usr/local/bin/bash .

ポータブルなbashスクリプトを書くには、ハードコーディングされた bash プログラムです。 POSIXには、それに対処するメカニズムがすでにある。 PATH . にあるディレクトリのいずれかにプログラムをインストールするというものです。 PATH そして、プログラムを実行したいときに、システムがそのプログラムを名前で見つけることができるようにする必要があります。

悲しいかな、あなたは できない は、こうすればいい。

#!bash

カーネルは、(ある人はするかもしれませんが) PATH を検索してくれます。 をするプログラムがあります。 PATH という名前で検索してくれるんですけどね。 env . 幸いなことに、ほとんどすべてのシステムには env のプログラムがインストールされています。 /usr/bin . そこで env をハードコードしたパスを使用し、その後に PATH を検索してください。 bash を実行し、あなたのスクリプトを解釈できるようにします。

#!/usr/bin/env bash

この方法には一つ欠点があります。POSIXによると、ハッシュバングには 1つの引数 . この場合 bash を引数として env というプログラムがあります。 に引数を渡すスペースが残っていないことになる。 bash . のようなものを変換する方法がないわけです。 #!/bin/bash -exu をこの方式に変更します。 このスキームには set -exu をハッシュバンの後に追加してください。

この方法には、もう一つ利点があります。システムによっては /bin/bash しかし、ユーザーはそれが気に入らなかったり、バグがあったり、古かったりして、自分の好きな bash を他の場所に移す。 OS X (Mac)ではよくあることで、Appleが出荷する古い /bin/bash をインストールし、ユーザーは最新の /usr/local/bin/bash をHomebrewのようなもので使用します。 を使用した場合 env を行うアプローチです。 PATH を検索する場合、ユーザーの好みを考慮し、システムが出荷したものよりもユーザーの好みのbashを使用します。