Windows10+WSL (Windows Subsystem for Linux) の環境整備

開発業務用にWin10マシンが支給されました。
私はいままでWin7マシンを用い、作業用のコンソールとして、Cygwinを使っていましたが、これを機に以前より楽しみにしていたWSL+Ubuntu環境へ移行することにしました。

方針

WSLの使い方として Java, WebLogic Server, Oracle Database などは Windows にインストールし、Linuxにはインストールしない方針にしました。
これは、業務関係者のPC環境としてWindowsが主流であり、いつでもその構成で動かせる環境にしておくことで、問い合わせを受けた際のトラブルの再現性を高めたいためです。

コンソールの文字化け

この方針で試しにLinuxで sqlplus を起動してみると文字化けしました。

$ sqlplus.exe

SQL*Plus: Release 11.2.0.2.0 Production on �� 11�� 27 18:58:01 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

���[�U�[�����͂��Ă�������:

Linux側のコンソールはUTF-8を期待していますが, Windows側で実行される sqlplus.exe は SHIFT-JIS の入出力で動作するため文字化けしています。
Linux の .bashrc に以下を追加して解決しました。

# WSLENVで指定した変数は、Windows側に伝搬します
export WSLENV=NLS_LANG
export NLS_LANG=Japanese_Japan.AL32UTF8
$ sqlplus.exe

SQL*Plus: Release 11.2.0.2.0 Production on 火 1127 19:05:05 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ユーザー名を入力してください: sys
パスワードを入力してください: abcdefg

ただし、パスワード入力時に文字がマスクがされず、むき出しになります。完璧とはいかないようです。

.exe をつけずにコマンド実行

次は、コマンド名に .exe をつけなくても実行できるようにします。
Linuxから Windows にインストールされた sqlplus を実行する場合、 sqlplus.exe のように.exeをつけないとコマンドが見つからずにエラーになります。
一方で、通常 Linux 向けに提供されるスクリプトは、この .exe を含まないない形でコマンドを呼び出す記述がなされています。
スクリプトの手直しは避けたいので、パスの通ったディレクトリに、次のようなシンボリックリンクを作成して回避することにしました。
(ちなみに当初は .bashrc で alias を指定して解決しようと試みましたが、スクリプトに記述されたコマンドに対してaliasは無効であり、意味がありませんでした)

sqlplus -> /mnt/c/app/db/app/oracle/product/11.2.0/server/bin/sqlplus.exe
subl -> /mnt/c/Program Files/Sublime Text 3/subl.exe
docker -> /mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe

以下は $JAVA_HOME/bin 配下のコマンドと、コマンドリストファイル exe-list からシンボリックリンクを作成する自作スクリプトです。
java, javac は文字化けを回避するオプションを指定するためため、シンボリックリンクではなく、bashスクリプトで呼び出す形にしています。

.exeへのシンボリックリンク+呼び出しスクリプトの作成処理
#!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0); pwd)

COMMAND_LIST_FILE=$SCRIPT_DIR/exe-list
BIN_DIR=$SCRIPT_DIR

create_link(){
  while read CMD ARGS || [ -n "${CMD}" ]; do
    # remove current file
    [ -e $BIN_DIR/$CMD ] && rm $BIN_DIR/$CMD
    if [ -z "$ARGS" ]; then
      # create symbolic link
      which $CMD.exe && ln -s "`which $CMD.exe`" $BIN_DIR/$CMD || echo "[ERROR] $CMD"
    else
      # create bash script
      which ${CMD}.exe && echo -e "#!/bin/bash\n`which ${CMD}.exe` $ARGS \$*" > $BIN_DIR/${CMD} && chmod u+x $BIN_DIR/${CMD}
    fi
  done
}

ls $JAVA_HOME/bin | grep ".exe" |  sed -e "s/\.exe//" | create_link
cat $COMMAND_LIST_FILE | create_link
上記スクリプトの入力ファイル: exe-list
sqlplus
docker
docker-compose
docker-credential-wincred
docker-machine
kubectl
notary
subl
explorer
java -Dfile.encoding=UTF-8
javac -J-Dfile.encoding=UTF-8
一旦これでOK

これで、WSL 環境がある程度整いました。
今後も文字化けやスクリプトエラーが起きる可能性があり、問題を見つけては潰すといったモグラ叩き感は否めませんが、よく使うコマンドに関しては許容できるレベルの使い勝手になりました。