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 火 11月 27 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