私はそれを知っています、それを忘れて、再びそれを学び直してください。それを書き留める時間です。
私はそれを知っています、それを忘れて、再びそれを学び直してください。それを書き留める時間です。
回答:
実行不可能なsh
スクリプトを実行するには、次を使用します。
sh myscript
実行不可能なbash
スクリプトを実行するには、次を使用します。
bash myscript
実行可能ファイル(実行可能権限を持つ任意のファイル)を起動するには、パスで指定するだけです:
/foo/bar
/bin/bar
./bar
スクリプトを実行可能にするには、必要な権限を与えます。
chmod +x bar
./bar
ファイルが実行可能である場合、カーネルはその実行方法を把握する必要があります。非バイナリの場合、これはファイルの最初の行を見ることで行われます。含まれている必要がありhashbang
ます:
#! /usr/bin/env bash
hashbangは、実行するプログラムをカーネルに指示します(この場合、コマンド/usr/bin/env
は引数を指定して実行されますbash
)。次に、スクリプトは(2番目の引数として)プログラムに渡され、後続の引数としてスクリプトに指定したすべての引数が渡されます。
つまり、実行可能なすべてのスクリプトにはハッシュバングが必要です。そうでない場合は、それが何であるかをカーネルに伝えていないため、カーネルはそれを解釈するために使用するプログラムを認識していません。それはbash
、perl
、python
、sh
、または何か他のもの。(実際には、カーネルはユーザーのデフォルトのシェルを使用してファイルを解釈することがよくありますが、これはまったく適切なインタープリターではないか、一部を解析できるが、次のような微妙な動作の違いがあるため、非常に危険ですケースとの間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
すると、名前で実行したいときにシステムがプログラムを見つけられるようになるという考え方です。
残念ながら、これを行うことはできません。
#!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
どこかにインストールしている場合があります。これは多くの場合、OS X(Mac)の場合で、Appleは古いバージョン/bin/bash
を出荷し、ユーザーは/usr/local/bin/bash
Homebrewなどを使用して最新のものをインストールします。検索env
を行うアプローチを使用するPATH
場合は、ユーザーの設定を考慮に入れ、システムに付属しているものよりも優先するbashを使用します。
zsh
、私のシェルとして、私が使用しますかhashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
コードを Zシェルで実行する必要がある場合(およびその場合のみ)を使用する必要があります。
ボーンシェルの場合:
sh myscript.sh
bashの場合:
bash myscript.sh
スクリプトを現在のシェルで実行する場合(たとえば、ディレクトリまたは環境に影響を与えることができるようにする場合)、次のように言う必要があります。
. /path/to/script.sh
または
source /path/to/script.sh
注/path/to/script.sh
たとえば、相対することができが. bin/script.sh
走るscript.sh
中でbin
、現在のディレクトリの下のディレクトリ。
まず、実行権限を与えます:-
chmod +x script_name
sh script_name
bash script_name
./script_name
注:-'ls -a'を使用して、ファイルが実行可能かどうかを確認できます。