双六工場日誌

平凡な日常を淡々と綴ります。

シェルスクリプトのコーディングスタイル・コーディング規約について考えてみる

シェルスクリプトのコーディングスタイルについて調べ物をしたので、その情報源の一覧と今の感想のメモを書いてみます。

上記のページの最初には「ここに書かれている内容は、あくまで筆者の好みでありほぼ完全に主観」と書かれていますが、この内容は規約としてどこでも採用すべき内容だと思います。また定数には大文字の変数名を使うというガイドラインですが、自分で書く場合、環境変数も大文字変数に加えます。
好みがあるとすれば、インデントの幅ぐらいでしょうか?
ここではインデント幅は半角スペース2つが推奨されていますが、個人的には半角スペース4の方が好みです。

Pythonのコーディング規約PEP 8を見ても、タブとスペースを混ぜるな、スペースの方が人気があるので推奨というぐらいの書き方で、明確にインデント幅を指定していないので、インデント幅まではスタイルに含めないのがいいんでしょうか。

Tabs or Spaces?
    Never mix tabs and spaces.
    The most popular way of indenting Python is with spaces only. 

ちなみに、Pythonライブラリではインデント幅は「4」が多いらしく、僕もPythonのインデント幅は4。シェルスクリプトのインデント幅もそれに合わせているという面が強いです。



以下は、参考になりそうな海外の情報(英語)です。

  • SIGNAL Trapを使ったロックファイル削除などについても書いてあるコーディングスタイル。

シグナルを使った終了処理はこういう感じがよさそうです。bashの擬似シグナルは便利だけど、広く使うスタイルとしては入れない方がいいかなと思います。

  • PDF。SIGNAL Trapを使った一次ファイルの削除方法やテスト手法にも言及しているコーディング規約のドキュメント。


以下は、近年のIT勉強会クラスタの議論から。



また、反応としてはだいぶ遅いですが、上に紹介した情報の中の @ さんの「シェルスクリプトを書く際に気を付けていること8箇条」の補足を書いたに若干コメントしたいと思います。

  • スクリプトのオプション指定について

上記のエントリに、以下の2つを比較して、前者の方がコードが減るのでベターというコメントがありましたが、僕としては後者の書き方を使っています。

#!/bin/sh -ue
#!/bin/sh
set -ue

というのも、以下のようにスクリプトを実行した場合、

sh test.sh

前者は、/bin/sh 、後者は/bin/sh -ue でコマンドが実行され、後者の方が自分の直感に近いからです。
例えば、スクリプトのデバッグのために、一時的に-xオプションを付けてコマンド実行する場合、以下のように実行することが度々あると思うのですが、その際にば前者は、/bin/sh -x 、後者は/bin/sh -xue となってしまい、混乱を招くように思います。*1

sh -x test.sh

なので、スクリプトのオプションはsetコマンドで別の行にて定義するのがいいのかなと。Perlで言うと「use strict; use warnings;」みたいな感じで「set -ue」。*2

上記のエントリではShebangでの「#!/bin/sh」と「#!/bin/bash」で違いがあるのか、という話も出てきますが、それについては別のエントリに書いています。結論からいうと、多くの場合で問題になりませんが、微妙に動作が異なります。

/bin/sh と /bin/bash の違い



今のところの結論として、最初に紹介しているページの内容に加えて「set -ue」、必要に応じてSIGNAL Trapの使い方を共通認識とするのがいいのかなと思っています。


とはいえ、スタイルや規約には一長一短あるので、このエントリを見てくれた方もリンク先を見て自分に馴染むところを取り入れてもらうのがいいかなと思っておりますです。

*1:逆にshコマンドを明示的に指定する場合には、オプション指定は一旦解除したいという目的を持って前者を書くという考え方もありうるとは思いますが。

*2:ちなみに -ue と書いているのは、自分としてはeオプションの方が外す頻度が多いため、それを後に書く癖がついています。これは、どちらが先でもよいと思います。