「ConEmu」からBUWのBashを直接起動する

前回紹介した「ConEmu」だが、実際に使い続けると不便に感じる場面が出てくることだろう。その1つがConEmu起動時に現れるcmd.exeだ。ConEmuの既定設定がcmd.exeを呼び出しているため、このような現象が発生する。ConEmu起動時にBUW(Bash on Ubuntu on Windows)のBashを起動するには、「Startup」の設定を変更すればよい。ConEmuをインストールした時点で、Windows 10へインストール済みのシェル一覧が作成されるが、その中から「{Bash::bash}」を選択する。

ConEmuを起動した状態で[Win]+[Alt]+[P]キーを押すか、<Show System Menu>ボタン→<Settings>と順にクリックする

ツリーから<Startup>をクリックして選択し、<Specified named task>のドロップダウンリストリストから「{Bash::bash}」を選択して、<Save settings>ボタンをクリックする

設定終了後は1度ConEmuを終了し、再び起動すれば最初からBashが起動するはずだ。ただし、ホームディレクトリではなく、「%USERPROFILE%」フォルダーがカレントディレクトリとなる。ConEmu.exe(もしくはConEmu64.exe)には起動時に指定できる「-dir」オプションが用意されているものの、こちらで指定できるのはあくまでもWindows 10のフォルダーのため、「-dir %USERPROFILE%\AppData\Local\lxss\home\kaz」と指定してみた。だが、BUWのルートディレクトリがカレントとなり、ホームディレクトリを直接開くことはできなかった。ひとまずは「cd」を実行し、Bash上でホームディレクトリへ移動してほしい。

これで最初からBUWのBashが起動するが、カレントディレクトリはWindows 10の「%USERPROFILE%」フォルダーとなる

この点については追い追い調べるとして、もう1つ筆者が気になるのがビープサウンドだ。タイプミスなど意図しないタイミングでビープ音が鳴ることに以前から苛立っていたい。Anniversary Update(バージョン1607)に向けたWindows 10 Insider PreviewのBUWで試していた限りでは、定番の手法ではビープ音を止めることはできなかった。だが、本稿執筆にあたって使用しているWindows 10 Insider Preview ビルド14905のBUWでは、以前は無視された「~/.inputrc」に「set bell-style none」を記述することで止まることを確認した。試しにWindows 10 バージョン1607のBUWでも確認してみたが、同様の手法が使えるため、筆者が気付かない間にBUW側の互換性が向上したのだろう。なお、行入力支援ライブラリreadlineの設定を行う.inputrcファイルの設定変更を行っているため、「echo $'\a'」を実行すればビープ音は鳴る。

Bashのコマンドラインに「echo "set bell-style none" >> ~/.inputrc」と入力して[Enter]キーを押す。これで次回起動時からビープ音を抑止できる

最後はSSHサーバーの存在だ。Windows 10を開発者モードに変更すると、自動的にSSHサーバーが有効になる。だが、SSHクライアントでローカルホストに接続すると、起動するシェルはcmd.exeでありBUWのBashではないため、使いにくさばかりが目立ってしまう。執筆時点で「常に」BUW上でSSHサーバーを起動し、PuTTYなどのSSHクライアントからBashを操作する手法は確立できていないが、手動であればSSHサーバーは起動するため、必要であればWindows 10のSSH関連サービスを停止しておこう。こちらはSSHサーバー本体の「SSH Server Proxy」と、SSHサーバーブローカーの「SSH Server Broker」を停止し、サービスの起動設定を無効に変更する。もちろんGUIからも操作できるが、管理者権限を持つコマンドプロンプトに、下記の囲みをそのままコピー&ペーストすればよい。

sc stop SshProxy
sc config SshProxy start= disabled
sc stop SshBroker
sc config SshBroker start= disabled

これで各サービスが停止し、起動設定を無効にできる

取得結果をインターネットショートカットファイルに変換する

それでは今回のシェルスクリプトを紹介しよう。いつもどおりvimなどで下記の内容を作成し、chmodコマンドで実行権限を付加してほしい。

 #!/bin/bash

 URLBASE=http://www.soumu.go.jp
 URL={$URLBASE}/menu_news/s-news/
 I=0
 OutputDir="/mnt/c/Users/kaz/Desktop/Output/"

 if [ ! -d $OutputDir ]; then
    mkdir $OutputDir
 fi

 Array=($(curl -s -S $URL | grep "<td" | sed -e 's/<td>//g' -e 's/<td .*">//g' -e 's/<\/td>//g' -e 's/<a.*="//g' -e 's/<\/a>//g' -e 's/">/\n/g' -e' s/ /_/g'))

 for Obj in ${Array[@]}; do
    Num=`expr $I % 4`
    case $Num in
        0 )
            StrDate=`echo ${Obj} | sed -e 's/[\r\n]\+//g' | nkf` ;;
        1 )
            StrURL=`echo ${Obj} | sed -e 's/[\r\n]\+//g'` ;;
        2 )
            StrTitle=`echo ${Obj} | sed -e 's/[\r\n]\+//g' | nkf` ;;
        3 )
            StrCat=`echo ${Obj} | sed -e 's/[\r\n]\+//g' | nkf`
            echo -e "[InternetShortcut]\nURL=$URLBASE$StrURL" > $OutputDir$StrTitle".url" ;;
    esac
    let I++
 done

ご覧のとおり前回のスクリプトと同じく、出力に関する部分を少々変更したに過ぎない。6~10行目は出力先として、ユーザーのデスクトップフォルダー(ディレクトリ)を指定し、存在しない場合は新たに生成するmkdirコマンドを実行している。今回大きく変更したのは25行目のechoコマンド。あらかじめ取得した情報をインターネットショートカットファイルとして、取得した情報ごとに生成している。

そもそもインターネットショートカットは、Internet Explorerの「お気に入り」として使用されるファイルだが、その内容はテキストファイルだ。1行目に「[InternetShortcut]」というタグを出力し、2行目は「URL=」という文字列を付与してから、取得したURLを出力している。このシェルスクリプトを実行すると、変数OutputDirで指定したフォルダーに、項目ごとのインターネットショートカットファイルを生成する仕組みだ。

シェルスクリプトの実行結果。記事ごとのインターネットショートカットファイルを生成できる

今回、取得した日付やカテゴリーをファイル名に加えるか迷ったが、試してみるとファイル名が冗長になるため、記事のタイトルに限定した。インターネットショートカットファイルの場合、OSを問わずにワンアクションでWebブラウザーから記事を閲覧できると同時に、ファイル単位で他のユーザーと情報共有も可能になる。Excelワークシートやテキストで管理した方が手軽だが、Windowsとの連携という意味でコードを書き換えてみた。このように取得した情報は自由に加工できるので、是非ご自分のワークスタイルに即した手法を見つけてほしい。

阿久津良和(Cactus)