Cygwinのシェルから,ファイル名を指定してそのファイルを開く,手軽なコマンドがあることを知りました.「cygstart」です.
- Yet Another...: どうやらzshなしでは生きられない体になってしまったようなので…
- clmemo@aka: Cygstart -- Cygwin からフォルダーを開く、Word ファイルを開く
- [cygwin] cygstart が便利 horiday blog
8文字打つのは面倒なので,aliasをすることにします.「.」に割り当てるとしましょう.
alias .=cygstart
いろいろ試してみます.まず,「. --help」で,ヘルプメッセージが出ます.「Let Windows start a program or open a file or URL.」と書かれており,引数はURLでもいいとのことで,「. 当雑記のURL」を実行したところ,すでに開いていたFirefoxで,タブが追加され,当雑記が表示されました.
「. .」とすると,なじみのエクスプローラが起動しました.カレントディレクトリの各フォルダとファイルの一覧を,見ることができます.
「. 画像ファイル」だと…IrfanViewで,画像が開きました.ここまで実行して気づいたのですが,cygstartを使って,他のプロセスを開いたら,すぐにシェルが利用可能になります.バックグラウンドでコマンドをするためにつける(よう,演習室でときたま学生に指導する),「&」が不要ということです.
「. 絶対パス指定による画像ファイル」も,問題ありませんでした.「/」から始まるCygwinの形式でも,「C:\」などから始まるWindowsの形式でも,大丈夫です.パス区切り文字に関して,一つの引数の中に「\」と「/」を混在させても,うまくいきました.
画像を,ペイントで開くことにしましょう*1.ペイントのパスを知るには,Windowメニュー>全てのプログラム>アクセサリ>ペイント と進めてから,右クリックし,プロパティを選択します.リンク先は「%windir%\system32\mspaint.exe」となっていますが,自分の環境ではC:\Windows\System32\mspaint.exeのことです.
ということで,「. $C/Windows/System32/mspaint.exe 画像ファイル」とすれば,ペイントで起動し,画像が表示されました.
ただしこのとき,画像のほうのファイル名はWindowsの形式でないといけません.「. $C/Windows/System32/mspaint.exe 絶対パス指定による画像ファイル」では,エラーダイアログが出まして,「C:\cygdrive\絶対パス指定による画像ファイルには無効なパスが含まれています。」と言ってきます*2.
少しだけ悪戦苦闘して,「. $C/Windows/System32/mspaint.exe $(cygpath -w 絶対パス指定による画像ファイル)」を実行すれば,うまくいくことが分かりました.しかしこれを頻繁に使うなら,aliasかfunctionにしないといけませんかね…「function ..() {. $1 $(cygpath -w $2)}」でしょうか.
補足2点.
- findとxargsを組み合わせて,個別のファイルにcygstartをする場合には,「find 条件 | xargs cygstart」ではダメで,「find 条件 | xargs -n 1 cygstart」とする必要があります*3.
- 別名で「.」を選びましたが,zshではこれはビルトインコマンドになっていて,引数をファイル名とみなし,シェルスクリプトとして実行します.この機能はsourceコマンドで代用できます*4し,どうしても素の「.」を使う必要があれば,「\. 引数」とすればいいだけです.なお,過去には,「_」に別名をつけています:2010年12月17日.
翌日,コマンドの文字色を#FF0033から#FF6600に変更しました.
*1:TeXコンパイルをして,Adobe Readerで開くという例がCygwin+LaTeXにおける文書作成にmakeコマンドの活用 : らぁの気ままな雑記にあり,参考にさせてもらいました.
*2:Windows でエラーダイアログのメッセージをコピーする | すぐに忘れる脳みそのためのメモによると,このエラーダイアログ上でCtrl+Cとすれば,メッセージもろもろがコピーできるのですね.
*3:xargs + cygstart - argius note
*4:http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.htmlや,man zshbuiltinsを読むと,「. 引数」ではカレントディレクトリを対象とせず,「source 引数」では対象とする(それも最優先で),という違いがあります.bashでは,.もsourceも同じ機能で,カレントディレクトリを対象とするか否かは,別の設定から判断するとのこと.