ターミナルから規定ではないプログラムでファイルを開く方法

 

ターミナルからファイルを開きたいが、

規定のプログラムではなく他のプログラムを指定して開きたいというときのコマンドをご紹介します。

今まではコマンドを使ってエクスプローラを開き、そこからGUI操作していたのですが、

コマンド一本で済ませられないかなーと試行錯誤した結果、うまくいきました。


規定のプログラムで開く場合

規定のプログラムで開く場合は簡単です。

Windows ならstart ファイル名(コマンドプロンプトならファイル名のみも可)を、

Mac や Linux ならopen ファイル名のコマンドを打てば、

規定のプログラムで開くことができます。

このとき、ファイル名へのパスはカレントディレクトリからの相対パスを指定します。


規定ではないプログラムで開く場合

「HTML ファイルはいつも VS Code で開くけど、今はブラウザで開いて確認したい」

というようなときには、規定のプログラム(VS Code)ではないプログラム(ブラウザ)を指定することになります。


Windows のコマンドプロンプトならstart プログラム名 ファイル名と指定します。

1
start firefox index.html

ファイル名へのパスはカレントディレクトリからの相対パスを指定します。


Mac や Linux ならopen -a プログラム名 ファイル名です。

1
open -a Firefox index.html

こちらもファイル名へのパスはカレントディレクトリからの相対パスで大丈夫だと思います。


ここまでは特に問題ないのですが、

問題は Windows で Git Bash を使っているときです。

Git Bash の場合

答えから言うと、start プログラム名 $(cygpath -w $(pwd)/ファイル名)です。

1
start firefox $(cygpath -w $(pwd)/index.html)

Git Bash でstart firefox index.htmlと打つと、

index.htmlが URL とみなされてhttp://www.index.html/にアクセスしてしまいます。

Chrome でも同様です。


そこで絶対パスを指定しなければなりません。

それでいちいち絶対パスを打つのは面倒くさいと思って、

カレントディレクトリのパスを出力するpwdコマンドを使いたくなります。

でもpwdが出力するパスの形式は Windows のものとは異なります。

1
2
$ pwd
/c/Users/username/Documents

そこで、パスを Windows 形式に変更するために、cygpath -wを使います。

1
2
3
4
5
$ cygpath -w $(pwd)
C:\Users\username\Documents

$ cygpath -w $(pwd)\\index.html
C:\Users\username\Documents\index.html

コマンドを$()または``で囲むことで、その出力を別のコマンドに利用することができます。

これで絶対パスを取得できたので、これを引数としてstartコマンドに渡します。

1
start firefox $(cygpath -w $(pwd)\\index.html)

なお、URL のアドレスバーでは\/になりますので、

1
start firefox $(cygpath -w $(pwd)/index.html)

でも大丈夫です。


シェルスクリプトで簡略化

とはいえこのながーいコマンドをいちいち打つのは面倒です。

そこでシェルスクリプト(Windows ならバッチファイルもあり)です。

シェルスクリプトやバッチファイルはコマンドをまとめたものです。

Git Bash で使うならシェルスクリプトのほうがタイプ数が少ないし相性がいいと思います。

ファイルを作成

まずシェルスクリプトを入れ込むディレクトリを作成します(任意)。

その中に.shファイルを作成します。

1
2
3
4
5
$ mkdir shellscripts

$ cd shellscripts

$ vi open.sh

ファイルの中には次のように書きます。

open.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

file=$1
bro=$2

if [ "$bro" == "c" ]
then
  bro="chrome"
else
  bro="firefox"
fi

start $bro $(cygpath -w $(pwd)/$file)

exit 0

$1 $2は引数です。

3-4行目で変数に代入しています。

6-11行目では、ブラウザの指定がcのときには Chrome を、

特に指定がなかったときには Firefox をブラウザとして選択するという処理です。

13行目が本体のコマンドです。

ファイルに権限を付与

ファイルに実行権限がないと直接実行できません。

まず実行権限を確認します。

1
2
$ ls -l open.sh
-rwxr-xr-x ...

一番左の-rwxr-xr-xが権限の状態を表しています。

2-4文字目が所有者の権限を表していて、rwxなら読み、書き、実行の権限があるということです。

もしrw-のように、実行権限がなくなっていたら、chmodコマンドで権限を付与します。

1
2
3
4
5
6
7
8
9
$ ls -l open.sh
-rw-r-xr-x ...

$ chmod 755 open.sh
または
$ chmod u+x open.sh

$ ls -l open.sh
-rwxr-xr-x ...

パスを通す

次にパスを通して、どこからでも実行できるようにします。

シェルスクリプトへのパスを次のように指定します。

1
$ export PATH="$PATH:/c/Users/username/Documents/shellscripts"

コマンドを使わないなら、Windows ならシステム環境変数の編集 > 環境変数 > Pathから追加することもできます。


これでどこからでもopen.shを使えるようになりました。

open.sh index.htmlと打てば Firefox でカレントディレクトリ以下のindex.htmlを立ち上げてくれるようになります。

open.sh index.html cとすれば Chrome で立ち上げてくれます。


また、open.shとしましたが、実は拡張子がなくても動きます。

1
$ mv open.sh open

これでopen index.htmlのように、純粋なコマンドと同じような使い方ができるようになります。

こんなに短く書けるなんて感動です!

関連記事

【Vim】検索範囲の指定方法まとめ

【Vim】検索範囲の指定方法まとめ


参考になれば幸いです。

では~👋