経緯
BoWでファイルを開くためのコマンドが欲しかった(macのopenコマンドみたいなの)。
参考にさせていただいたもの
Bash on Windowsでmacのopenコマンドみたいなこと
いろいろ試したこと
xdg-openとかgnome-openとか入れてみたけど、BoWからではwindowsに設定されている既定のアプリケーションを呼び出せないのでだめだった。
BoWからcmd.exeとコマンドを打つとcmdを呼び出せることを知ったので、これを使うことにした。
ファイルパスに空白が存在するとめんどうなことになる
cmd.exe /c start [ファイルパス]を実行したとき、このコマンドはファイルパスに空白が含まれているかいないかによって、次の二通りの振る舞いをする。
1.空白が含まれていないとき
windowsの規定のプログラムによって指定されたファイルが開かれる
2.空白が含まれているとき
ファイルパスと同名のタイトルのcmdが起動する
ファイル名に空白含まれる場合、startに渡された一つ目の引数はcmdのウィンドウタイトル名として扱われるためらしい。これを回避するために、startコマンドの一つ目の引数に""を引数として渡し、二つ目の引数にファイルパスを指定する。こうすることで、ファイルパスに空白が含まれていようがいまいが、startは同じふるまいをするようになる。
それと、BoWとcmdでは空白文字の扱いが違う。BoWではファイル名に空白文字が含まれていた場合a\ bとバックスラッシュを用いて表記されるが、cmd上ではa bとバックスラッシュを用いず表記される。
スクリプト
以上を踏まえてスクリプトを作る。
# !/bin/bash
# check number of arguments
if [ $# -eq 0 ] ; then
echo "no file path"
exit 0
fi
# replace
replace_path=`echo $@ | sed 's/\\\ / /g'`
# replace_path=$(readlink -f $@ | sed -e 's/\/mnt\///' -e 's/\(^[A-z]\)/\1:/g' -e 's/\//\\/g')
# open
cmd.exe /c start "" "$replace_path"
exit 0
あとは実行権限を付与して
chmod +x open.sh
aliasを貼って使うだけ。
alias open='~/open.sh'
今後の課題
ディレクトリをopenする場合、一旦そのディレクトリへ移動してからopen .と実行しなければならない(open ./だと開いてくれない)ので、それを改善する。