すべてのスクリプトに* .shおよび* .rbファイル拡張子を付ける必要がありますか?


20

$ HOME / binディレクトリに、手巻きの実行可能スクリプトがたくさんあります。bashで書かれたものもあれば、Rubyで書かれたものもあります。それらはすべて、シェルに使用するインタープリター(私の場合はbashまたはRuby)を伝えるシェバン行を先頭に持っています。

これらのスクリプトにファイル拡張子を付けて、それらが記述されているスクリプト言語を示す方が良いのではないかと思っています。たとえば、Rubyのスクリプトには* .rbサフィックスが付いており、bashのスクリプトには* .shサフィックスが付いています。

現在、これらのスクリプトにはファイル拡張子のない単純な名前が付いています。

ベストプラクティスは何ですか?


1
簡単なスクリプトを使用して、シバンからエクステンションに変換したり戻したりするのは簡単です。必要に応じて、後で試して修正してください。
アーロンJラング

回答:


9

将来的にスクリプトを整理したい場合、ls *.rbまたは必要にcp *.sh応じて、ワイルドカードコマンドを実行できます。

私の意見では、早期に開始するか、後で後悔します。

のような編集者vimは、シバンまたはファイル拡張子に基づいて正しい構文強調表示を適用することもできます。

これは、さまざまなエディターでモードラインを使用することでも実現できます。例:vim:

# vim: ft=sh

2
私見、組織は実装の詳細ではなく、機能によってより良く行われます。
-grawity

4
@grawity:それにもかかわらず、シェバングのためにgrepをより簡素サフィックスによって整理されています...
アキラ

私はグロブの理由に同意しますが、ほとんどの編集者はシバンを読んでファイルタイプを判断するのに十分賢いです。
リッチホモルカ

10

まあ-人生のほとんどのもの:あなたのニーズに依存します。

これらのスクリプトはbin-directoryにあると述べましたが、これらのスクリプトはコマンドラインから呼び出されると仮定しています。ユーザーとして、bla.kshまたはfoo.bashと入力しなければならない場合、それを迷惑と見なします。また、コーダーが別のインタープリターに移動することを決定した場合、コマンド名も変更され、これらのツールを使用する他のスクリプトを修正する必要があります- ユーザーコーダーがまったく同じ人であっても非常に迷惑です。

しかし一方で、プロジェクトビルドディレクトリでは.shや.tclなどの拡張子を使用します。この方法で、make機能を使用してファイルを宛先ディレクトリにデプロイできますが、この段階でファイルのサフィックスを削除します。


6

明らかに、binディレクトリ内の実行可能ファイルと編集可能な「ソース」ファイルにはいくつかの違いがあります。

  • ソースファイルの場合、接尾辞を付けて何が何であるかを確認し、#!行のスキャンに失敗するインテリジェントでないツールを使用すると便利です。
  • モジュールの場合、それらは、同じインタプリタ(または全くインタプリタ)を使用してすべてがプログラムの関連セットで使用している、含むことが一般的である.pm.shまたは.soそのようなケースです。
  • 実行可能プログラムの場合、その名前は「プログラミング契約」の一部であり、ユーザーや他のスクリプトによって実行されます。実装が変わっても名前が変わらないことが重要です。したがって、明らかにファイル名には接尾辞を付けないでください

コンパイルされたプログラムの場合、「ソース」と「実行可能」の違いは明らかです。1つはソースコードを含み、もう1つは機械語または解釈されたバイトコードを含みます。スクリプトの場合、明らかな違いはありませんが、makeコマンドは「スクリプトのソースコード」と「スクリプトの実行可能バージョン」の概念的な分離を維持します。「シェルスクリプト」のデフォルトの「コンパイラ」は単純にcp

別の$HOME/sourceディレクトリを保持することをお勧めします。

  • によって作成されたようなシンボリックリンクを保持しln -s ../source/foo.sh $HOME/bin/fooます。または
  • install -m 755 foo.sh ../bin/foo; を使用して、変更(およびテスト)後に手動でコピーします。または
  • 使用してMakefileからソースファイルをコピーする前に構文チェックを実行するためのルールを$HOME/source$HOME/bin

脚注:シェルスクリプトモジュールは、別のシェルスクリプトでのみ使用可能であり、.またはsource組み込みコマンドを使用してそのスクリプトの内部コンテキストを変更します。これは、(他のプログラムと同様に)別個のプロセスとして実行され、親プロセスを変更できない実行可能スクリプトとは異なります。大まかな慣習として、/usr/lib/name_of_program/name_of_module.shコマンドは/usr/bin/name_of_command(サフィックスなしで)入るのに対してモジュールは入る。


3

それは必要はありません。カーネルはすでに使用する正しいインタープリターを(#!行ごとに)通知されており、すべての一般的なテキストエディターも同様に読み取ります。実行可能プログラムに拡張子があるのは、それが何らかの形で(プログラムまたはユーザーまたは両方にとって)重要である場合だけです。


一方、モジュールとライブラリにはほとんどの場合、拡張機能があります(.rbRubyモジュール.so用、ELF共有ライブラリ用など)。


問題は、「接尾辞を指定しないとカーネルが実行できるか」ではなく、「MEが役立ちますか」ということです。タイプされた文字の増加は、完了とは無関係です。
アキラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.