UNIXシェルとコマンドプロンプトの関係

Windows 10は「cmd.exe」というコマンドラインインタプリタ(シェル)を用意している。MS-DOS時代まで振り返ればCommand.comというシェルを源流に持ち、MS-DOS自体が当時のパーソナルコンピューター向けのOSとして開発された経緯を持つ。その設計は当時普及していたUNIXを意識し、現在でも利用可能なバッチファイルは、UNIXのシェルスクリプトを参考にしたものだ。

UNIXで使われていたシェルは数多く存在するが、大別するとBourne Shell系とC Shell系に分けられる。現在多くのLinuxディストリビューションが標準シェルとしてBashを採用する理由の1つは、元となるBourne Shellが初期のでから採用されていたからだろう。ただし、Bourne ShellとBashは似て非なる存在だ。

前者は当時AT&Tベル研究所に務めていたStephen Bourne氏によるソフトウェアだが、後者はBrian Fox氏は1980年代に開発した"Bourne Again Shell"の略称である(現在はChet Ramey氏がメンテナンスを行っている)。Bourne Shellとの後方互換性とC Shell、C Shellをさらに改良したKorn Shellなど他のソフトウェアから有益な機能を取り込み、その利便性から多くのLinuxディストリビューションが、Bashを標準シェルとして採用しているのが、主な経緯だ。

こちらはWindows 10にインストールしたCygwin。やはり標準シェルはBashを採用している

結局のところ「Bash on Ubuntu on Windows(BUW)」はcmd.exeでは補えず、ソフトウェア開発者が使い慣れたLinux環境をWindows 10で実現するために、Windowsの既存機能を利用した実装である。MicrosoftはBUWについて「開発者向けの機能」と説明し、X Window SystemなどGUI環境は未サポートだ。

だが、WSL(Windows Subsystem for Linux)はデスクトップ環境を構築できる。XmingもしくはVcXsrvといったWindows上で動作するXサーバーをインストールすれば、以前からXアプリケーションは実行可能だった。あとは「/etc/dbus-1/session.conf」のlistenポートをすべて「tcp:host=localhost,port=0」に置き換えれば、Ubuntuのデスクトップ環境であるUnityを実行することができる。

BUWとVcXsrvをインストールし、xeyesを起動した状態

vimなどで「/etc/dbus-1/session.conf」内容を変更する。sedを使えば簡単だ

今回はVcXsrvを使用しているが、Xmingでも同様にディスプレイ設定を変更し、「ubuntu-desktop」などのパッケージをインストールすれば、下図に示したようにUbuntuのデスクトップ環境をWindows 10に再現可能だ。ただし、インストールを終えるまで結構な時間を要するので、お時間があるときに試してほしい。

Xサーバーのディスプレイ設定をシングルウィンドウに切り替える

BUW上でUbuntuのUnityデスクトップ環境。compiz経由で起動している

シェルスクリプトでJPEG形式に変換する

それでは今回のシェルスクリプトを紹介しよう。前回は「ImageMagick」の「convert」を使って、他の画像形式からJPEG形式に変換したが、ImageMagickには画像処理に関するさまざまなコマンドを用意している。その中の1つが画像ファイルの情報を取得する「identify」だ。画素数やファイルの種類、色数などさまざまな情報を取得できる。

画像ファイルの情報を取得する「identify」コマンド

こちらを使って、一定サイズより大きい画像ファイルは指定したピクセル数以下にリサイズするシェルスクリプトを作成してみたい。それでは下記シェルスクリプトを「vim」など使って作成し、前回と同様に実行権限を与えておこう。

 #!/bin/bash

 Dir=/mnt/c/Users/kaz/Desktop/Work1
 Number=1
 MaxSize=1200

 cd $Dir

 for OldFile in $(ls *.jpg *.png *.tif *.bmp); do

    Width=`identify -format "%w" $OldFile`
    NewFile=$(printf %03d.jpg $Number)

    if [ ${Width} -gt $MaxSize ]; then
        convert -density 72 -quality 90 -resize 1200x $OldFile $NewFile
    else
        convert -density 72 -quality 90 $OldFile $NewFile
    fi

    rm $OldFile
    echo "Convert and Rename $OldFile to $NewFile."
    Number=$((Number+1))
 done;

前回と異なるのは、5行目に加えた変数「MaxSize」。リサイズの可否はこのピクセル数を元に判断するので、用途に応じて変更する。次が11行目。「identify」コマンドのオプションを使用し、X方向のピクセルサイズを変数「Width」に代入した。

続いて14~18行も今回新たに加えた部分だ。if文は与えられた条件式によって処理を変更する構文である。あらかじめ取得した画像ファイルのX方向ピクセル値(Width)が、指定したピクセル値(MaxSize)より大きければ(-gt)、15行目のコマンドを実行し、異なる場合は17行目のコマンドを実行する仕組みだ。

今回は画像ファイルのDPIを72に変更する「-density 72」、JPEGファイルのQualityを指定する「-quality 90」、そしてリサイズを実行する「-resize 1200x」を追加している。この辺りの諸条件は用途に合わせて変更してほしい。

シェルスクリプト実行後の画像ファイル。縦横比を維持したまま指定したピクセル値でリサイズされている

阿久津良和(Cactus)