ShellCheck静的アナライザーとLinuxおよびUnixでのスクリプト品質の改善





シェルスクリプトの作成は魅力的です。 コマンドラインスクリプトは、日常のアクティビティを自動化するのに役立ちます。 美しいもの(またはある種のマック)を作成できますが、実際に何かを作成する場合は、プログラマーが必要とするとおりにコードが取得されることを確認しておくと便利です。 うまく書かれていないスクリプトは危険です。 ほとんどの初心者は、StackOverflowからコードスニペットをコピーするか、Googleで必要なものを見つけるか、LinuxのQ&A サイトを使用してスクリプトを作成します 。 このようなプログラミングへのアプローチは、低品質のコードとエラーの出現につながります。 たとえば、 VAR



変数が定義されていないため、実行すると災害につながるrm



コマンドがあります。



 rm -rf "/$VAR/*"
      
      





スクリプトの問題の多くは、Haskellで記述されたShellCheck静的コードアナライザーなどのリンターで解決できます。 スクリプトテキストのエラーを検索し、実行されたチェックに関するレポートを表示するのに役立ちます。 これにより、生産性とコード品質が向上します。 今日は、ShellCheckをLinuxおよびUnixライクなオペレーティングシステムにインストールして使用する方法について説明します。



設置



ShellCheckをローカルにインストールする最も簡単な方法は、ディストリビューションで使用されているパッケージマネージャー(apt / apt-get / yumなど)を使用することです。



DebianDebian / Ubuntu LinuxへのShellCheckのインストール



ここでは、次のapt / apt-getコマンドが必要です。



 $ sudo apt install shellcheck
      
      





このコマンドに対するシステム応答の例を次に示します。



 [sudo] password for vivek: Reading package lists... Done Building dependency tree      Reading state information... Done The following NEW packages will be installed: shellcheck 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 1,841 kB of archives. After this operation, 15.5 MB of additional disk space will be used. Get:1 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 shellcheck amd64 0.4.6-1 [1,841 kB] Fetched 1,841 kB in 42s (43.4 kB/s) Selecting previously unselected package shellcheck. (Reading database ... 196100 files and directories currently installed.) Preparing to unpack .../shellcheck_0.4.6-1_amd64.deb ... Unpacking shellcheck (0.4.6-1) ... Setting up shellcheck (0.4.6-1) ... Processing triggers for man-db (2.7.6.1-2) ...
      
      





CentCentOS / RHEL / Fedora / Oracle LinuxにShellCheckをインストール



まず、CentOS / RHELでEPELリポジトリを有効にする必要があります



 $ sudo yum -y install epel-release
      
      





次に、次のyumコマンドを入力します。



 $ sudo yum install ShellCheck
      
      





このコマンドに応答して表示されるものは次のとおりです。



 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: centos.excellmedia.net * epel: mirror.nes.co.id * extras: mirrors.vonline.vn * updates: centos-hcm.viettelidc.com.vn Resolving Dependencies --> Running transaction check ---> Package ShellCheck.x86_64 0:0.3.5-1.el7 will be installed --> Processing Dependency: ghc(ShellCheck-0.3.5-297097a7f5fa37100847be7f096be51e) for package: ShellCheck-0.3.5-1.el7.x86_64 ..... .. ... Dependencies Resolved =============================================================================== Package                Arch         Version                  Repository  Size =============================================================================== Installing: ShellCheck             x86_64       0.3.5-1.el7              epel       495 k Installing for dependencies: ghc-ShellCheck         x86_64       0.3.5-1.el7              epel       540 k ghc-array              x86_64       0.4.0.1-26.4.el7         epel       113 k ghc-base               x86_64       4.6.0.1-26.4.el7         epel       1.6 M ghc-bytestring         x86_64       0.10.0.2-26.4.el7        epel       182 k ghc-containers         x86_64       0.5.0.0-26.4.el7         epel       287 k ghc-deepseq            x86_64       1.3.0.1-26.4.el7         epel        45 k ghc-directory          x86_64       1.2.0.1-26.4.el7         epel        59 k ghc-filepath           x86_64       1.3.0.1-26.4.el7         epel        60 k ghc-json               x86_64       0.7-4.el7                epel        96 k ghc-mtl                x86_64       2.1.2-27.el7             epel        33 k ghc-old-locale         x86_64       1.0.0.5-26.4.el7         epel        50 k ghc-parsec             x86_64       3.1.3-31.el7             epel       105 k ghc-pretty             x86_64       1.1.1.0-26.4.el7         epel        57 k ghc-regex-base         x86_64       0.93.2-29.el7            epel        28 k ghc-regex-compat       x86_64       0.95.1-35.el7            epel        15 k ghc-regex-posix        x86_64       0.95.2-30.el7            epel        47 k ghc-syb                x86_64       0.4.0-35.el7             epel        39 k ghc-text               x86_64       0.11.3.1-2.el7           epel       379 k ghc-time               x86_64       1.4.0.1-26.4.el7         epel       187 k ghc-transformers       x86_64       0.3.0.0-34.el7           epel       100 k ghc-unix               x86_64       2.6.0.1-26.4.el7         epel       160 k Transaction Summary =============================================================================== Install  1 Package (+21 Dependent packages) Total download size: 4.6 M Installed size: 28 M Is this ok [y/d/N]: y Downloading packages: (1/22): ghc-bytestring-0.10.0.2-26.4.el7.x86_64.rpm       | 182 kB   00:09    (2/22): ghc-array-0.4.0.1-26.4.el7.x86_64.rpm             | 113 kB   00:09    .... .. ... ghc-parsec.x86_64 0:3.1.3-31.el7                                             ghc-pretty.x86_64 0:1.1.1.0-26.4.el7                                         ghc-regex-base.x86_64 0:0.93.2-29.el7                                        ghc-regex-compat.x86_64 0:0.95.1-35.el7                                      ghc-regex-posix.x86_64 0:0.95.2-30.el7                                       ghc-syb.x86_64 0:0.4.0-35.el7                                                ghc-text.x86_64 0:0.11.3.1-2.el7                                             ghc-time.x86_64 0:1.4.0.1-26.4.el7                                           ghc-transformers.x86_64 0:0.3.0.0-34.el7                                     ghc-unix.x86_64 0:2.6.0.1-26.4.el7                                          Complete!
      
      





Fedoraを使用する場合、次のdnfコマンドを実行します。



 $ sudo dnf install ShellCheck
      
      





Arch Arch LinuxにShellCheckをインストールする



次のpacmanコマンドを入力します。



 $ sudo pacman -S shellcheck
      
      





▍GentooLinuxへのShellCheckのインストール



emergeコマンドを入力してください:



 $ sudo emerge --ask shellcheck
      
      





OpenOpenSUSE LinuxにShellCheckをインストールする



次のzypperコマンドを入力します。



 $ sudo zypper in ShellCheck
      
      





ShellmacOS UnixにShellCheckをインストールする



MacPortsを使用している場合は、次のportコマンドを使用します。



 $ port install shellcheck
      
      





macOS / OS XでHomebrewを使用する場合、次のようにbrewコマンドを入力します。



 $ brew install shellcheck
      
      





ShellCheckの使用方法



スクリプトでShellCheckをテストします。スクリプトの内容は、 catコマンドを使用して検査されます。



 $ cat -n backupme
      
      





彼のコードは次のとおりです。



 #!/bin/bash t="/tmp/exclude.$$" source ~/.backup.conf >$t for w in $WHATNOT do   echo $w >> $t done rsync $OPT -avr --exclude-from=$t  $WHAT $SERVER:$WHERE rm -rf $t
      
      





次に、ShellCheckを使用してスクリプトを確認します。



 $ shellcheck backupme
      
      





応答として、プログラムは次を表示します。





動作中のShellCheck



ShellCheckユーティリティは、引用符で囲まれていない変数の使用を修正することを提案し、他の問題も報告しました。 エラーを修正し、次のコマンドでスクリプトテキストを再度表示します。



 $ cat -n backupme
      
      





結果は次のとおりです。



 #!/bin/bash t="/tmp/exclude.$$" source ~/.backup.conf touch $t for w in $WHATNOT do   echo "$w" >> $t done rsync "$OPT" -avr --exclude-from=$t  "$WHAT" "$SERVER:$WHERE" rm -rf "$t"
      
      





テキストエディターでのShellCheckの統合



ShellCheckはvimまたはemacsに統合できます。その結果、エディターでスクリプトテキストを直接チェックします。 これは、プログラムをリントおよびビルドするための非同期ツールであるvim neomakeのプラグインの使用方法を示しています。 ~/.vimrc



vim- plugin managerを使用してインストールされました:



 call plug#begin('~/.vim/plugged') Plug 'pearofducks/ansible-vim' " install and use neomake linting Plug 'neomake/neomake' call plug#end()
      
      





ansible-vim



およびneomake/neomake



をインストールするには、vimで次のコマンドを入力します。



 :PlugInstall
      
      





プラグインを使用するには、bash / shスクリプトの編集中に次のコマンドを入力します。



 :Neomake
      
      





エディターでのプラグインの結果は次のとおりです。









NeomakeはShellCheckを使用して警告とエラーメッセージを表示します



まとめ



ShellCheckは、Linuxコマンドラインスクリプトを改善および修正できる優れたツールであると考えています。 コード内の多くの一般的な欠陥とエラーを検出できます。 SpellCheckの詳細については、プロジェクトサイト 、およびGitHubのリポジトリをご覧ください。



親愛なる読者! ShellCheckのようなものでスクリプトをチェックしますか?



All Articles