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


507

私はそれを知っています、それを忘れて、再びそれを学び直してください。それを書き留める時間です。


15
評判ステーションまでの
賛成投票の

あなたがそこに着いた素晴らしいエラーを賞賛するためだけに賛成投票するつもりはありません!
BRHSM 2017

回答:


942

実行不可能な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番目の引数として)プログラムに渡され、後続の引数としてスクリプトに指定したすべての引数が渡されます。

つまり、実行可能なすべてのスクリプトにはハッシュバングが必要です。そうでない場合、それ何であるかをカーネルに伝えていないため、カーネルはそれを解釈するために使用するプログラムを認識していません。それはbashperlpythonsh、または何か他のもの。(実際には、カーネルはユーザーのデフォルトのシェルを使用してファイルを解釈することがよくありますが、これはまったく適切なインタープリターではないか、一部を解析できるが、次のような微妙な動作の違いがあるため、非常に危険ですケースとの間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

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

このアプローチには別の利点もあります。一部のシステムにはが同梱されている/bin/bash場合がありますが、ユーザーはそれを気に入らず、バグがあるか古くなっていて、自分のシステムをbashどこかにインストールしている場合があります。これは多くの場合、OS X(Mac)の場合で、Appleは古いバージョン/bin/bashを出荷し、ユーザーは/usr/local/bin/bashHomebrewなどを使用して最新のものをインストールします。検索envを行うアプローチを使用するPATH場合は、ユーザーの設定を考慮に入れ、システムに付属しているものよりも優先するbashを使用します。


66
簡単な質問に対する良い答えを書いてくれてありがとう。
PA

5
私が使用している場合はzsh、私のシェルとして、私が使用しますかhashbang #! /usr/bin/env zsh
stefmikhail

6
@stefmikhail:スクリプトの呼び出しにどのシェルインタープリターを使用するかは関係ありません。スクリプト#! /usr/bin/env zshコード Zシェルで実行する必要がある場合(およびその場合のみ)を使用する必要があります。
Johnsyweb 2013

1
説明のための+1。私は忘れがちですが、コマンドの意味を知っていると思い出しやすくなります。
アンジェ

2
@Carpetsmokerこれは正しいです。ハッシュバングに限定されません。bashスクリプトは常にUNIXの行末を使用する必要があります。そうしないと、すべてのコマンドの最後の引数に、hashbangコマンド名と同じように\ rが追加されます。
lhunath 14

80

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

sh file.sh

bash file.sh

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

chmod +x file.sh

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

./file.sh

16

ボーンシェルの場合:

sh myscript.sh

bashの場合:

bash myscript.sh

この非常に明白な質問に答えてくれてありがとう。私のようなMacの人にとっては、ラップの間の古いUnixコマンドを忘れがちです。
PA

10

スクリプトを現在のシェルで実行する場合(たとえば、ディレクトリまたは環境に影響を与えることができるようにする場合)、次のように言う必要があります。

. /path/to/script.sh

または

source /path/to/script.sh

/path/to/script.shたとえば、相対することができが. bin/script.sh走るscript.sh中でbin、現在のディレクトリの下のディレクトリ。


7
ことが非常に調達またはrelateiveパス名でdot'ingときは注意してください。あなたは、必要があり、常にこれを行わない場合は./でそれらを開始し、相対パス名はスラッシュが含まれていない、あなたは現在のディレクトリに何かをする前に、PATHで何かを調達することがあります!虐待は非常に危険です。
lhunath 2009

0

まず、実行権限を与えます:-
chmod +x script_name

  1. スクリプトが実行可能でない場合:
    -shスクリプトファイルを実行する場合:-bashスクリプトファイルを実行する場合
    sh script_name
    :-
    bash script_name
  2. スクリプトが実行可能な場合:-
    ./script_name

:-'ls -a'を使用して、ファイルが実行可能かどうかを確認できます。


0

ファイル拡張子.commandがTerminal.appに割り当てられます。.commandファイルをダブルクリックすると実行されます。


0

さらに、スクリプトで#!hashbangを使用して、同じフォルダーからインタープリターを実行します。

例として/ usr / binからコピーされたphp7.2実行可能ファイルは、helloスクリプトに沿ったフォルダーにあります。

#!./php7.2
<?php

echo "Hello!"; 

それを実行するには:

./hello

どちらも同じように動作します:

./php7.2 hello
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.