GNU/Linux >> Linux の 問題 >  >> Linux

砲弾ショック?いいえ、ShellCheck!スクリプトのバグを見つけます。

良いスクリプトを書くのは難しいです。もちろん、明らかなPEBKACスキルだけでなく、古代の魔法や歴史もあります。レガシーの慣習はPlan 9とFLOW-MATICになりますが、ほとんどの人はソフトウェアを作成するときにあまり理解も気にもしません。次に、ソフトウェア開発にドストエフスキーの犯罪と罰がないということは、コードが怠惰になり、好きなように書くことができることも意味します。

何ヶ月も前に、私はあなたのシェルスクリプトをより少なくするように設計されたきちんとした小さなプログラムに出くわしました。これはShellCheckと呼ばれ、オンラインコンソールとして利用できます。また、ほとんどすべてのディストリビューションにインストールして、ワークフローなどに統合することもできます。興味をそそられて、私はa-explorinについて行きました。

穴に火をつける

私は自分のシェルスクリプトであるsimWANsimから始めました。これは、WANネットワークの遅延を簡単で便利な方法でシミュレートするように設計されたプログラムです(複数のインターフェイスやライブメディアなどは必要ありません)。これは本質的にBASHスクリプトであり、それがどれほど効率的でエレガントかを見たかったのです。ところで、スクリプトは評価するために実行可能である必要はありません。

shellcheck「スクリプト名」

エラーと警告の量に驚いたが、読み始めたとき、これらの多くは実際には同じ種類の悪いコーディング慣行の複数のインスタンスであり、スクリプト全体で数回繰り返された。さらに、エラーは理にかなっており、明確な方法で記述されており、単なるランダムなテクノバブルではないことに気づきました。スクリプトを修正する方法に関する実用的で有用な提案(例を含む)。

一般的なエラーの1つは、$()表記ではなくバックティックの使用でした。また、同じように他にもいくつかの行がありました。letexprの使用、グロブや単語の分割を防ぐための二重引用符の欠如、その他いくつかの小さな問題です。

simWANsim.shの152行目:
EGREP =`which egrep`
^ ----------- ^ SC2006:従来のバッククォートされた`の代わりに$(...)表記を使用します。 ..`。
^ --- ^ SC2230:これは非標準です。代わりに、組み込みの「コマンド-v」を使用してください。

つまり、
EGREP =$(which egrep)

simWANsim.shの304行目:
let PRNT =$ PRNT + 1
^ -------------- ^ SC2219:'let expr'の代わりに(( expr))。

ケーススタディ[原文のまま]に感銘を受けました。こんにちはこんにちは。私は実際には処理していないオプションを使用していました。また、不特定のフラグの一般的なケースもありませんでした。賢い小さな提案のように見えます。最も狡猾です。

simWANsim.shの178行目:
case $ flag in
^-SC2213:getoptsで-aが指定されていますが、この'case'では処理されません。
^-SC2213:getoptsで指定された-sですが、この「ケース」では処理されません。
^-SC2220:無効なフラグは処理されません。 *)ケースを追加します。

これらはどれも枢機卿ではありませんが、なぜそうではありません。結局のところ、コードを可能な限りクリーンでエレガントにすることができれば、コーナーケースエラーや奇妙な動作の可能性を排除できます。私はコードを書くのは好きではありませんが、もしあなたがそれをしているのなら、あなたはそれを正しくやったほうがよいでしょう。

また、非常に一般的なスクリプトをテストして、エラーがない場合に何が起こるかを確認しました。コマンドラインツールは、出力なしで終了します。オンラインツールを使用すると、次のようなメッセージが印刷されます。

$ shellcheck myscript
問題は検出されませんでした!

最後に、出力を美化し、出力の冗長性を変更し、スタイルと色をフォーマットし、ShellCheckをシェルの特定の方言(sh、bash、dash、kshを含む)で動作させる、wikiリンクを表示することができます。コーディングの実践とエラーに関する追加情報とリソース、およびその他のいくつかのオプションについて。全体として、シンプルで効果的かつエレガントです。

結論

ShellCheckは本当にクールなユーティリティです。普段はあまり気にしないのですが、見つけられるものがあれば美しさを味わうことができます。ツール自体はHaskellで書かれているため、私たち全員がまったく異なる形而上学的な面に置かれますが、作者に反対することはありません。

ご使用の環境でシェルスクリプトを使用している場合は、ShellCheckを試してみることを検討してください。人々が戻って古いものを修正することはめったにないので、コードにはたくさんの小さなレガシーの間違いがあるはずなので、あなたは驚くだろうと思います。不必要な膨満感の時代には、質素でエレガントであることは重要です。これはあなたのシェルダイエットを始める賢い方法です。したがって、別の記事を終了します。


Linux
  1. シェルスクリプトで入力を使用する方法

  2. Bashスクリプトに引数とオプションを追加する

  3. シェルスクリプトでSetuidを許可しますか?

  1. シェルスクリプトでパスワードを隠す?

  2. 検索結果を変数としてシェルスクリプトに保存しますか?

  3. シェルからPythonスクリプトを実行する方法

  1. シェルスクリプトでタイムアウトしますか?

  2. シェルスクリプトの連想配列?

  3. シェル スクリプトとはシェル スクリプトの作成方法