GNU/Linux >> Linux の 問題 >  >> Linux

Unix コンソールまたは Mac 端末でシェル スクリプトを実行するには?

シェルスクリプト「file.sh」を開始するには:

sh file.sh

bash file.sh

もう 1 つのオプションは、chmod コマンドを使用して実行権限を設定することです:

chmod +x file.sh

次のように .sh ファイルを実行します:

./file.sh

実行不可能な 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 かもしれません 、 perlpythonsh 、 または、他の何か。 (実際には、カーネルはユーザーのデフォルト シェルを使用してファイルを解釈することがよくありますが、これは非常に危険です。なぜなら、それはまったく適切なインタープリターではないか、一部を解析できる可能性があるためです。 sh の間の場合 および bash ).

/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 にあるディレクトリの 1 つにプログラムをインストールするという考え方です。 名前でプログラムを実行したい場合、システムはプログラムを見つけられるはずです。

残念ながら、できません これを行うだけです:

#!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 が古い /bin/bash を出荷している OS X (Mac) に当てはまります。 ユーザーは最新の /usr/local/bin/bash をインストールします Homebrew のようなものを使用します。 env を使用する場合 PATH を行うアプローチ ユーザーの好みを考慮して、システムに同梱されていたものよりも好みの bash を使用します。


Bourne シェルの場合:

sh myscript.sh

バッシュの場合:

bash myscript.sh

Linux
  1. ターミナルでループバッシュスクリプトを停止する方法は?

  2. シェルからPythonスクリプトを実行する方法

  3. * nixでログイン時にスクリプトを実行するにはどうすればよいですか?

  1. 現在のターミナルから新しいターミナルでシェルスクリプトを実行する

  2. N秒ごとにbashスクリプトを繰り返し実行するには?

  3. Bash/Shell で GUI の可用性を検出する方法は?

  1. Bashスクリプトでホスト名をIPアドレスに解決する方法は?

  2. シェルスクリプトBashでサブストリングをチェックする方法は?

  3. バックグラウンドでシェルスクリプトを実行する方法は?