Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

コーディング用テキストエディターに何を選ぶ?

読者諸氏はどのテキストエディターで、BUW(Bash on Ubuntu on Windows)のシェルスクリプトを記述しているだろうか。多くのテキストエディターは文字列の分類などを自動的に判断して、フォントや配色を変更するシンタックスハイライト機能を備えている。例えば下図に示したのは、日本語テキストエディターとしては事実上の標準とも言える「秀丸」とWindows版「Vim(KaoriYa版)」だ。

「秀丸」でシェルスクリプトを開いた状態

「vim」(正確にはgvim)でシェルスクリプトを開いた状態

秀丸は複数行コメント設定で「UNIXシェルスクリプト」を選択することで、「""(ダブルコーテーション)」で囲んだ文字列、ifやwhiteといった命令文の配色が変更されている。vimはテーマなどによって異なるものの、既定の設定ではカラフルな配色が施された状態だ。結局のところテキストエディターは自分の指に慣れたツールを選択するのが1番だが、より多くの機能を必要とするためマクロを追加するといった操作は楽しながらも、メンテナンスといった煩雑な場面を招いてしまう。

そこで筆者が最近注目しているのが「Visual Studio Code(以下、VSC)」である。IDE(統合開発環境)であるVisual Studioからフォークする形で、Microsoftがオープンソースベースで開発を進めているテキストエディターだ。Visual Studio譲りのインテリセンスといった機能を備え、柔軟なキーカスタマイズ機能も魅力的。必要であればVimやEmacsのキーバインドも適用できる。

「Visual Studio Code」に拡張機能「bashiling Theme」を適用した状態

さらに「Bash Debug」という拡張機能を導入すれば、bashdb(Bash Debugger Project)経由でVSCから、シェルスクリプトへブレイクポイントの設定や、変数の内容を確認するなど、IDEライクなデバッグも可能。もっともシェルスクリプトのコーディングに慣れた方なら、シェルスクリプトで実行したコマンドを表示するオプション「-x」や、加えて変数名を表示するオプション「-v」を活用すれば十分とも言えるが、コーディングに飽きた時はテキストエディターを変更することで、新たな刺激を得られるだろう。

VSCの拡張機能「Bash Debug」の概要

ドライブを占有するフォルダーをひと目で確認する

さて、Linuxなどではドライブの空き容量を占有しているディレクトリ(フォルダー)やファイル単位で確認するコマンド「du」が存在する。Windowsにない利点の1つだが、同コマンドは多くのオプションを備えており、オプション「-s(--summarize)」を使うことで、各ファイルの詳細情報をスキップした要約のみ確認することが可能だ。

Windows 10のユーザーフォルダー上で「df -s」を実行した状態

このコマンドをWindows環境に対して利用する場合、そのまま実行すると上図で示したようにアクセス権の関係からエラーメッセージが表示され、少々煩雑な結果となってしまう。だが、これらのエラーメッセージは「2>/dev/null」を追加することで表示を抑止することが可能だ。

「2>/dev/null」を追加すると標準エラー出力を抑止できる

LinuxのベースとなるUNIXには、「ファイルディスクリプタ」という概念があり、標準入力は「0」、標準出力は「1」、標準エラー出力は「2」と定義されている。つまり、「2>/dev/null」は「標準エラー出力を捨てる(/dev/nullへ出力する)」という意味を持つ。なお、/dev/nullはスペシャルファイルの1つであり、データを破棄する際に使われるものだが、コマンドプロンプト上で使用可能なデバイスファイル「NUL」も機能的には同義だ。

続いて利用するオプションが「-h(--human-readable)」である。上図のとおりduの実行結果は単なる数値で示されるため、ひと目で分かりやすいとは言いがたい。そこで用意されたのが「人が読みやすい」表示形式にするオプションである。前述したオプション「-s」と組み合わせることで実行結果の視認性が高まる仕組みだ。

duにオプション「-sh」を追加すると、人に優しい表示形式となる

だが、この状態でサブフォルダーの占有容量を個別に調べようとすると、MB(メガバイト)やGB(ギガバイト)と単位ごとに並び替わるが、いくつかのコマンドをパイプ経由で実行すれば、意図する結果を導き出せる。このような前提で作成したのが下記のシェルスクリプトだ。いつもどおり、vimなどのテキストエディターにコピー&ペーストし、chmodコマンドで実行権限を付与してから、お試し頂きたい。

 #!/bin/bash

 set TargetDir=/mnt/c/Windows/*

 du -sh $TargetDir 2>/dev/null | sort -h | tail -10

ご覧のとおり簡素なシェルスクリプトであり、コマンドラインから書き捨てるワンライナーで構わないレベルだが、Linuxコマンドに不慣れな場合はシェルスクリプトで実行できた方が便利だろう。duの動作は前述のとおりだが、そこからパイプ経由で標準出力を受け取ったコマンド「sort」ではオプション「-h(--human-numeric-sort)」を追加し、duの出力結果に応じた並び替えを可能にしている。後は出力結果から末尾10行を取り出すため、コマンド「tail -10」を追加。これでWindowsフォルダー下の各サブフォルダーが占有しているディスク容量をひと目で確認することができた。

シェルスクリプトの実行結果。Installerフォルダーが意外にディスク容量を占めていることが分かった

阿久津良和(Cactus)