Bashファイル拡張子とは何ですか?


84

テキストエディタでbashスクリプトを作成しましたが、bashスクリプトとして実行できるように、スクリプトをどの拡張機能として保存しますか?理論的にはsshサーバーを起動するスクリプトを作成しました。スクリプトをクリックしたら、どのようにスクリプトを実行させるのか疑問に思っています。OS X10.9.5を実行しています。


4
シェルスクリプトは特定の拡張子を必要としません。次のように実行しますbash myscript
anubhava 2015年

7
通常.shはですが、拡張機能が存在する必要はまったくありません。LinuxはWindowsではありません。スクリプトを解釈するプログラムは、最初の行で決定されます#!/bin/bash。つまり、です。パラメータが含まれる場合もあります。
Havenard 2015年

1
@anubhavaスクリプトをダブルクリックして、実際に「bash myscript」と入力しない場合、スクリプトを実行するにはどうすればよいですか
Amedeo

2
@Amedeoは、ファイルの先頭に行を付け#!/bin/bashます。
ヘイブン

回答:


110

他の答えとは異なり、.shシェルスクリプトの拡張機能を使用する一般的な規則がありますが、これは有用な規則ではありません。拡張機能はまったく使用しない方がよいでしょう。それを伝えることができることの利点foo.shその名前のためにそれがシェルスクリプトでとは最小限であり、柔軟性を失ってそれを支払うことになります。

bashスクリプトを実行可能にするには、上部にシバン行が必要です。

#!/bin/bash

chmod +xコマンドを使用して、システムがそれを実行可能ファイルとして認識するようにします。次に、にリストされているディレクトリの1つにインストールする必要があります$PATH。スクリプトが呼び出された場合は、とfoo入力してシェルプロンプトからスクリプトを実行できますfoo。または、現在のディレクトリ(一時スクリプトでは一般的)にある場合は、と入力できます./foo

シェルもオペレーティングシステムも、ファイル名の拡張子部分に注意を払いません。それは名前のほんの一部です。そしてではなく、特別な拡張子を付けことで、シェルスクリプト(sh、bash、cshなど)であるかどうかに関係なく、それを使用するすべての人(ユーザーまたは別のスクリプト)が実装方法を気にする必要がないようにします。 、Perl、Python、またはAwkスクリプト、またはバイナリ実行可能ファイル。このシステムは、インタープリター型スクリプトまたはバイナリ実行可能ファイルのいずれかが、その実装方法を知らなくても、気にせずに呼び出すことができるように特別に設計されています。

UNIXライクなシステムは、純粋にテキストのコマンドラインインターフェイスから始まりました。KDEやGnomeなどのGUIは後で追加されました。GUIデスクトップシステムでは、通常、プログラムを参照するアイコンをダブルクリックするなどして、プログラムを(スクリプトまたはバイナリ実行可能ファイルのどちらでも)実行できます。通常、これにより、プログラムが出力する可能性のある出力が破棄され、コマンドライン引数を渡すことができなくなります。シェルプロンプトから実行するよりもはるかに柔軟性がありません。ただし、一部のプログラム(主にGUIクライアント)では、より便利な場合があります。

シェルスクリプトは、GUIからではなく、コマンドラインから学習するのが最適です。

(一部のツールファイル拡張子に注意を払います。たとえば、コンパイラーは通常、拡張子を使用して、コードが記述されている言語を判別します.c。Cの場合、.cpp c ++など。この規則は実行可能ファイルには適用されません。)

UNIX(およびUNIXライクなシステム)はWindowsではないことに注意してください。MS Windowsは通常、ファイルの拡張子を使用して、ファイルを開く/実行する方法を決定します。バイナリ実行可能ファイルには.exe拡張子が必要です。WindowsにUNIXライクなシェルがインストールされている場合は、.sh拡張機能をシェルスクリプトとして認識し、シェルを使用して開くようにWindowsを構成できます。Windowsには#!規則がありません。


2
私が目指しているのは、4番目の段落であなたが言ったことです。スクリプトを参照するアイコンをクリックしたときにスクリプトを実行する。
アメデオ

2
@Amedeo:それはあなたのデスクトップ環境に依存します。私が使用しているもの(UbuntuではCinnamon)では、実行可能スクリプトのアイコンをダブルクリックすると、ターミナルで実行するか、エディターで表示するか、ターミナルなしで実行するように求められます。これは、ファイル拡張子に関係なく行われます。
キーストンプソン

4
(ネクロ)拡張子を省略すると、同じ名前のフォルダーを作成できなくなります。したがって、たとえば、deploy.sh(またはdeploy.bash)と、deploy追加のデプロイメントロジックを備えたフォルダーがあります。スクリプトの名前を単純に変更するdeployと、名前の競合が発生します。ファイルまたはフォルダーに異なる名前を付けると、管理性が損なわれ、場合によってはファイルの並べ替えが損なわれます(lsエディターなどで)。もちろん、シェバンは-結局のところ-決定要因です。しかし、ファイル拡張子には正当な場所があります。
カフォソ2017年

2
@Kafoso:同じ名前のスクリプトとディレクトリが必要だと感じたことはないと思います。もしそうなら、ディレクトリを呼び出すかもしれませんがDeploy、大文字と小文字を区別しないファイルシステムにコピーするときに問題が発生する可能性があります。
キーストンプソン

2
Macでは、ファイルをダブルクリックすると、常にデフォルトのアプリでファイル開きます。したがって.sh、スクリプトを目的のエディターで開くように拡張機能を用意すると便利です。ダブルクリックしたときにスクリプトを実行する場合は、.command拡張子を指定すると、ダブルクリックしたときにターミナルで実行されます。
BallpointBen 2018

18

拡張機能は必要ありません(または任意の拡張機能を選択できます.shが、便利な規則です)。

スクリプトは#!/bin/bash(最初の行はexecve(2) syscallによって理解されます)で開始し、ファイルをで実行可能にする必要がありますchmod u+x。したがって、スクリプトがファイルにある$HOME/somedir/somescriptname.sh場合は、一度入力する必要があります

 chmod u+x  $HOME/somedir/somescriptname.sh

ターミナルで。コマンドについてはchmod(1 を、syscallについてはchmod(2)を参照してください。

ファイルパス全体を入力する場合を除いて、そのファイルをPATHenviron(7)execvp(3)を参照)に記載されているディレクトリに配置する必要があります。これ~/.bashrcは、ログインシェルがbash)の場合に永続的に設定できます。

ところで、スクリプトを他の言語で書くこともできます。たとえば、Pythonでで始める#!/usr/bin/pythonか、Ocamlで#!/usr/bin/ocaml...で始めることができます。

(何を言ったのか!)ダブルクリックしてスクリプトを実行することはデスクトップ環境の問題であり、デスクトップ固有の問題である可能性があります(Kde、Mate、Gnome、....またはIceWMまたはRatPoisonとは異なる場合があります)。おそらく、EWMH仕様を読むことで、より良い画像を得ることができるかもしれません。

おそらく、でスクリプトを実行chmod可能にすると、デスクトップ上でクリックできるようになる可能性があります(明らかに、MacOSXのQuartz)。しかし、おそらくそれが視覚的なフィードバックを与えるようにする必要があります。

また、sshを使用してリモートでアクセスする場合を含め、いくつかのコンピューターにはデスクトップがありません。

クリックしてシェルスクリプトを実行するのは良い考えではないと思います。おそらく、シェルスクリプトに引数を指定できるようにしたい場合(そして、クリックしてどのように引数を指定しますか?)、その出力に注意する必要があります。シェルスクリプトを記述できる場合は、ターミナルでインタラクティブシェルを使用できます。それがスクリプトを使用するための最良かつ最も自然な方法であること。優れたインタラクティブシェル(zshfish、または最近のbashものなど)には、美味しくて構成可能なオートコンプリート機能があり、多くの入力を行う必要はありません(tabキーボードのキーの)。また、スクリプトとプログラムは、多くの場合、複合コマンド(パイプラインなど)の一部です。

PS。私は1986年からUnixを使用し、1993年からLinuxを使用しています。クリックして自分のプログラムやスクリプトを開始したことはありません。どして私がこんな事に?


3
さて、テキストエディタでスクリプトを作成しました。ファイルをデスクトップに保存します。デスクトップに保存されているスクリプトをクリックすると、実際にクリックしたときに実行されるようにします。
アメデオ2015年

6
デスクトップが何であるかわかりません(KDE、Gnome、MATEなど)。ターミナルでコマンドラインを使用することを強くお勧めします。特にスクリプトを実行する場合は、スクリプトを実行することを強くお勧めします(おそらく、スクリプトにいくつかの引数を指定します。デスクトップでどのように実行しますか?)。シェルスクリプトをコーディングできる場合は、ターミナルでシェルをインタラクティブに使用できるはずです
Basile Starynkevitch 2015年

2
私のポイントは、シェルスクリプトをコーディングしている場合は、ターミナルでコマンドラインを使用する習慣を身に付ける必要があるということです。
Basile Starynkevitch 2015年

2
私が取り組んでいるプロジェクトのことだと理解しています。クリックしたらスクリプトを実行したい。ターミナルを使用してスクリプトを実行することを避けようとしています。
アメデオ2015年

3
実行可能性を所有者に制限する特別な理由がない限り、私はではchmod +xなくを使用しますchmod u+x
キーストンプソン

2

ただ.sh

次のようなスクリプトを実行します。

./script.sh

編集:anubhavaが言ったように、拡張子は実際には重要ではありません。ただし、組織上の理由から、拡張機能を使用することをお勧めします。


6
スクリプトを実行している場合、通常、スクリプトの記述を気にする必要はありません。bashスクリプトとバイナリ実行可能ファイルは同じ方法で実行されます。.sh実行可能スクリプトに接尾辞を追加することは、一般的に役に立たない混乱です。
キーストンプソン

1
はい、しかし私が編集で言ったように-それはスクリプトを整理するための慣習です-それ以上ではありませんか?!
マークアントンダーメン2015年

5
.sh拡張機能を備えたスクリプトはたくさんありますが(拡張機能を備えたスクリプトは少なくなります.bash)、それがまったく役立つとは思いません。スクリプトに名前を付け、foo.sh後でPerlで再実装することにした場合は、名前を変更する(そしてそれを使用するすべてのものを編集する)か、誤解を招くような拡張子を付けたままにすることができます。名前を付ければfoo、その問題はありません。
キーストンプソン

@KeithThompson自分で使用することを考えることができます。スクリプトが何で書かれいるか気になります。Perlについて話すことはできませんが、スクリプトがPythonまたはBashで書かれている場合は非常に気になります。一般的に、Bashスクリプトは何があっても機能すると思いますが、Pythonスクリプトには依存関係があり、Python2とPython3は相互に互換性がありません。また、コンパイルされたバイナリとスクリプト(どちらも拡張子がない)を区別することも重要だと思います。依存関係のニーズが異なるためです(たとえば、バイナリにはライブラリが必要で、AMD64用にコンパイルされてのみ機能する場合があります)。
jrh

@jrh確かに、それが重要な場合もあります(head -1 script.fooまたはを実行することでわかりますfile script.foo)。しかし、すべてが正しくインストールおよび構成されている場合、99%の確率で、コマンドに想定どおりの処理を実行させたいだけです。私にとって、それは私がそれを実行するたびに.pyまたは.bash接尾辞を意識しなければならないことを正当化するものではありません。
キーストンプソン

2

私はこれがかなり古いことを知っていますが、これは質問が求めていたものに追加されるように感じます。

Macを使用していて、スクリプトをダブルクリックして実行できるようにする場合は、.command拡張機能を使用する必要があります。また、以前と同じように、ファイルをchmod -x

前に述べたように、これは実際にはそれほど有用なtbhではありません。


1

TL; DR-スクリプトのユーザー(必ずしも開発者である必要はありません)がGUIインターフェイスを使用している場合、使用しているファイルブラウザーによって異なります。MacOSのFinderでは.sh、スクリプトを実行するために拡張機能が必要になります。ただし、Gnome Nautilusは、適切にシェバンされたスクリプトを、.sh拡張子の。

bashスクリプトで拡張機能を使用する理由と反対の理由はすでに何度も言われていますが、拡張機能を使用しない理由や理由はそれほど多くありませんが、経験則としては適切だと思います。

あなたがbashに飛び乗ってターミナルを一般的に使用するタイプであるか、ターミナルを使用しない他の誰かのためのツールを開発している場合は、 .sh、bashスクリプトに拡張機能を追加してください。そうすれば、そのスクリプトのユーザーは、GUIファイルブラウザでそのファイルをダブルクリックしてスクリプトを実行することができます。

ターミナルで主にすべてまたはほとんどの作業を行うタイプの場合は、bashスクリプトに拡張機能を追加する必要はありません。~/.bashrcスクリプトとディレクトリを視覚的に区別するようにファイルをすでに設定していると仮定すると、これらはターミナルでは何の役にも立ちません。

編集:

ターミナルウィンドウを開くためのばかげた単純なbashコマンドを使用した4つのテストファイル(それぞれが実行されるファイルに与えられた権限を持つ)を備えたGnome Nautilusファイルブラウザーでgnome-terminal

  1. 拡張子のないファイル #!/bin/bash最初の行に。

    ファイルをダブルクリックすることで機能しました。

  2. 最初の行に.sh拡張子が付いたファイル#!/bin/bash

    ファイルをダブルクリックすることで機能しました。

  3. #!/bin/bash最初の行に拡張子がなく、拡張子がNOのファイル。

    ファイルをダブルクリックすることで機能しました...技術的には、GUIはそれがシェルスクリプトであることを示していませんでした。プレーンテキストファイルだと言っていました。

  4. 最初の行に.sh拡張子がNOのファイル#!/bin/bash

    ファイルをダブルクリックすることで機能しました。

ただし、Keith Thompsonがこの回答のコメントで指摘したよう.shに、ファイルの最初の行でbash shebangの代わりに拡張子を使用することに依存すると(#!/bin/bash)、問題が発生する可能性があります。

ただし、以前にMacOSを使用していたとき、.sh拡張機能のない適切にシェバンされた(それは単語ですか?)bashスクリプトでさえMacOSのGUIから実行できなかったことを思い出します。コメントで誰かが私を訂正してくれることを望んでいます。これが当てはまる場合は、.sh拡張子が重要なファイルブラウザが少なくとも1つあることを証明します。


どのGUIファイルブラウザを使用していますか(または、より適切には、ユーザーは何を使用していますか)?スクリプトの実行方法を決定するために拡張機能を使用していますか?
キーストンプソン

さて、私が最も経験を積んだプラットフォームはMacOSです。Finderでは、ユーザーはどのアプリをどの拡張機能に関連付けるかを決定します。現在、私はLinuxでGnomeを使用していますが、GnomeのNautilusファイルブラウザが拡張子のないファイルとどのように相互作用するかを実験することはまだできていません。
ライアンハート

.sh接尾辞が付いた実行可能スクリプトが#!/bin/bash最初の行にある場合、GUIファイルブラウザーを使用shしてスクリプトを呼び出しますか(シェバンを無視します)?もしそうなら、それはいくつかの問題を引き起こす可能性があります。(答えはブラウザによって異なる可能性があります。)
キーストンプソン

そこに良い点があります。上記の回答を、今行った実際のテストで更新しました。
ライアンハート

興味深いですが...あなたはそれが「うまくいった」と言いました。4つのテストケースのそれぞれについて、/bin/bashまたはで呼び出したかどうかを知っておくとよいでしょう/bin/sh(後者はシバンのないスクリプトのデフォルトです)。/bin/shがへのシンボリックリンクである場合/bin/bash(これはかなり一般的です)、の値を調べることでわかります$0。(また、sh設定時にbashが呼び出された場合POSIXLY_CORRECT=y。)
Keith Thompson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.