UNIXシェルスクリプトのファイル拡張子[終了]


45

ウィキペディアでは、.shの記事は次のように述べています。

.shファイル拡張子タイプについては、Bourne shellを参照してください。

他のUNIXシェルはどうですか?

私は実行中のインタープリターを示すためにファイル内でシバン が使用されていることを知っていますが、私は疑問に思います:

  • ファイル拡張子とファイル拡張子なしの長所と短所は何ですか?

4
時々、shebangなし(またはexec許可なし)のシェルスクリプトが見つかることがあります。その場合、.shで終わる名前は、それらを実行するbash script.sh(またはshもちろん)ユーザーへのヒントになります。
アンスガーエステルマン

3
シェルスクリプトに拡張子がある場合、通常は.shです。.kshまたは.bashスクリプトを見たことがありません。ただし、例として/etc/init.d/*にあるすべてのスクリプトのように、ほとんどのシェルスクリプトには拡張子はありません。
リチャードホロウェイ

単純な結論(yesまたはno)は意見ですが、考慮すべきことはそうではありません。
ctrl-alt-delor

回答:


35

私は呼ぶだろう.shされて何か意味移植できるようにする(そして、できればあるポータブル)。

それ以外の場合は、言語を非表示にする方が良いと思います。とにかく、読者はシバンの行でそれを見つけるでしょう。(実際には、.bashまたは.zshなど、接尾辞はほとんど使用されません。)


1
このページだけから、それを使用している非常に多くの人々がすでに見られます。なぜ「まれに使用される」と言うのですか?引用はありますか?または、これは単にあなたの経験に基づいていますか?
Pacerier

23

厳密に言えば、技術的にはファイル拡張子の「良い慣行」は存在しないと言えます。Unix/ Linux / * BSDファイルシステムは、それ自体は拡張子をサポートしていません。拡張子と呼んでいるものは、単一のファイル名の接尾辞にすぎません。これは、VM / CMS、VMS、MS-DOS、およびWindowsファイルシステムと、inode-moral-equivalentの特別なスポットが拡張用に予約されているOSとは異なります。

これでちょっとした暴言はありますが、シェルスクリプトファイル名に「.sh」または「.ksh」または「.bash」という接尾辞を付けるのは少しばかげていると思います。プログラムはプログラムです。実行されるものを区別することには利点がありません。ファイル名の接尾辞のためだけに、Unix、Linux、または何らかのカーネルがインタープリターを呼び出すことを決定したカーネルはありません。それはすべて、#!行、またはファイルの先頭にある他の「マジックナンバー」バイトシーケンスによって行われます。実際、ファイル名「拡張子」に基づいて何を実行するかを決定することは、Windowsをマルウェアの磁石にする要因の1つです。「something.jpg.exe」という名前のファイルに関係するWindowsマルウェアの詐欺の数を調べます。デフォルトでは、新しいWindowsは「.exe」拡張子を表示せず、「

とにかく、多くの場合、直進コマンドと考えることができるのはシェルスクリプトです。時々ccshスクリプト、firefoxshスクリプト、startxshスクリプトでした。スクリプトに「.sh」という接尾辞を付けると、認知的または組織的な利点があるとは思わない。


24
同意しません!私の仕事は、バイナリ実行可能ファイルからシェルスクリプト(ksh、bash、およびいくつかのレガシーcsh)までの数千のファイルを含むアプリケーションをパッケージ化することです。私にとって、それは私を信じない私たちが議論していると我々が探しているファイルの種類を一目(または正規表現で)で知ることができるように違いを生みます。私のポイントがあるということである可能性があり excuted取得し、どのような区別で利益のベストプラクティスは、明示的にファイルの種類を明記奨励すべきです。
ラーム

4
@rahmu:それを答えとして書いてください。正規表現で識別可能な名前がそのアプリケーションのパッケージ化(および保守)にどのように役立つかについて、いくつかの詳細を示します。特に、ファイルを解釈するものとファイル名のサフィックスとの相互作用と、それがタスクの実行にどのように役立つかに注意してください。私は自分の見方に反する真剣な議論に興味があり、納得できたら変えたいと思っています。私はそれを証明するためにあなたのコメントを支持しました。
ブルースエディガー

3
残念ながら、現在の仕事での現在の経験しか話せません。一般的に良い慣習と標準についてはあまり知りません。ここに回答を投稿する前に、調査を行う必要があると思います。今夜、仕事の後に調べます:)
rahmu

2
@rahmuファイルタイプを判別するための「file」コマンドがあります。異なるシェル用に作成されたスクリプトを区別できます。
マット

3
シェルスクリプトに.sh拡張子を.sh付けた場合、起動時にコマンド名の一部としてそれを入力する必要があります。それが私がその拡張機能を入れるのが好きではない主な理由です(シバンラインを持つものと同じです)。ところで、Windowsの問題は.exeプレフィックス自体ではありません(image.jpg結局Linuxで実行可能ファイルを作成するのは簡単です)が、Windowsが通常、その拡張子を隠しているという事実と、実行可能ファイルを起動するのに必要なアクションドキュメントを開くことはまったく同じです。
celtschk 14

12

多数の?nix環境で働いてきた人として、私は多種多様なシェルで書かなければなりませんでした。信じられないかもしれませんが、プラットフォーム間で、シェルは同じではありません。したがって、(必要に応じて)複数のシェルで個人ライブラリを管理する場合、シェルを識別するために拡張機能を使用すると非常に役立ちます。そのようにして、別のプラットフォームに移動し、シェルがわずかに異なる場合、変更の対象となるスクリプトがわかります。.sh .ksh .bsh .csh ...



あなたは持っていない#!スクリプト(例えばの開始時に#!/bin/bash)?
ctrl-alt-delor

Gnu / Linux、BSD、およびUNIXはすべてUnixです。?nixは必要ありません。Linuxはカーネルであり、AndroidはLinuxを使用しますが、Unixではありません(追加のソフトウェアを追加しない限り、この場合、Unixアプリがあります)。
ctrl-alt-delor

@ ctrl-alt-delor:「Unix」は商標です。多くの場合、商標の問題(および反論者)を避けるために「?nix」を使用します。
JS。

@JS `UNIX 'はThe Open Groupの商標です。Unixとunixはgreens.org/about/unix.htmlで
ctrl-alt-delor

6

実行可能ファイルは互換性がないため、拡張子を使用しないでください。あなたがシェルスクリプトを持っていることを想像してからa.sh、python a.pyで書き直して、スクリプトを呼び出すすべてのプログラムを変更する必要があり、実装の詳細を漏らしました。

MircosoftのWindowsでのファイル名拡張子の全体は混乱です。たとえば、ある可能性がありa.audio, b.audio, c.audio、あるa.mp3, b.wav, c.ogg、およびd.picture, e.picture, f.pictureあるd.jpeg, e.png, f.gif。ほとんどの場合、音声や画像の形式を気にしません。また、すべてのファイル拡張子を新しいユーザーに教えるのに長い時間を費やす必要があります。


もう一つの理由は、使用しない*.shDebianのは、ということであるに私はちょうど走っrun-partsなどのように、拡張子を持つスクリプトを実行されません/etc/cron.*/archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
ロス・パターソン

5

あなたが言ったように、Unixファイル拡張子は純粋に情報です。正しいシェバンを持ち、実行可能であるためにはスクリプトが必要です。

拡張子を使用しないか、を使用できます.sh

使用されるシェル(csh、tcsh、bash、sh、...)に関係なく、私は個人的に次の規則を使用します。

  • システムまたは高品位スクリプトの拡張はありません(非常にまれです)。
  • .shハイグレードの古典的なスクリプトのため、低いです。

「低から高のクラシックスクリプト」とはどういう意味ですか?
Pacerier

私はそれによって抽象化または組織レベルを意味したと思います。つまり、いくつかのコマンドの背後でどの言語/スクリプトツールが使用されているかは気にしません。したがって、拡張機能は使用しません。他の人にとっては、bashまたはエキゾチックなkshシェルスクリプト(適切な拡張子)であることを知っておくとよいでしょう。...しかし、それは2年前でした;)
Ouki

3

シェルスクリプト拡張機能は非常に便利です。たとえば、同じディレクトリに複数の言語の複数のファイル(bash、awk、luaなど)を持つスクリプトを書くことがよくあります。bashファイルのみで文字列を検索する必要がある場合、拡張機能はこれを非常に便利にし、誤検知を減らします。または、そのプロジェクトのすべてのbashコードの行カウントを行いたい場合。

プログラムを実行するときに拡張子を入力するのは苦痛なので、毎回拡張子を入力することなく編集/実行するために、メインの実行可能ファイルへの拡張子なしでシンボリックリンクも作成します。シンボリックリンクは安価で簡単です。



2

他の人が言ったように、シェルは拡張を気にしません。ただし、ファイルの人間による迅速な識別は可能です。.pyまたは.shで終わるファイルが表示され、それらが(少なくとも)どうあるべきかすぐにわかります。Steveが言うように、ファイル拡張子による検索や行カウントの実行も実用的な考慮事項です。

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