「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}」を選択する。
ツリーから<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上でホームディレクトリへ移動してほしい。
この点については追い追い調べるとして、もう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'」を実行すればビープ音は鳴る。
最後は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)