目的
Macのopenコマンド風にLinuxでもファイルを開けるようにします。つまり
myopen image.png
myopen /dir/doc.txt
とファイルパスを入力するだけで拡張子に対応したアプリでファイルを開けるようにするということです。
環境
- Ubuntu 18.04
- zsh
方法
シェル起動時に読み込まれるファイルに関数を定義しておく。
- bashなら~/.bashrc
- zshなら~/.zshrc
myopen() {
# 第一引数は$1
fpath=$1
# パターンマッチで拡張子を取り出す
fext="${fpath##*.}"
# case文で分岐
case $fext in
pdf)
# 拡張子がpdfのときに実行するコマンド
evince $fpath & ;;
png|jpg)
eog $fpath & ;;
c|cpp|txt)
atom $fpath ;;
esac
}
コメントに記載したとおりですが
- コマンド実行時の引数(ファイルパス)を受け取る
- 拡張子を取り出す
- 拡張子ごとに分岐してコマンドを実行する
という流れです。
シェルスクリプト入門 書き方のまとめ
パス文字列からファイル名などを抜き出す
各ファイルは以下のアプリで開いていますが、もちろん好みのアプリに変更可能です。
- pdf → evince
- png, jpg → eog
- c, cpp, txt → atom
.bashrcや.zshrcを更新したら以下のコマンドで変更を反映させます。
exec bash
exec zsh
冒頭に記載したように次のコマンドでファイルを開けるようになっているはずです。
myopen ファイルパス
おまけ(URLもブラウザで開く)
上記のopen関数に少し追加すればファイルだけでなくURLにも対応可能です。
myopen() {
# 第一引数は$1
fpath=$1
# パターンマッチでURL判定
if [[ $fpath =~ ^http ]]; then
firefox $fpath &
exit 0
fi
# パターンマッチで拡張子を取り出す
fext="${fpath##*.}"
(以下省略)
}
パターンマッチでhttpから始まるかどうかを判定し、trueならfirefoxで開くようにしています。次のように使用可能です。
myopen https://www.google.com/
シェルの補完ができなくなった時
例えば./dirというディレクトリに移動しようとして
cd d(tab)
と入力してtabでディレクトリ名を補完しようとすると次のようなエラーが出ることがあります。
function definition file not found
これはシェルのキャッシュが不具合を起こしているためで、キャッシュファイルを削除してシェルを再起動すれば治ります。
rm ~/.zcompdump
exec zsh
まとめ
.bashrcや.zshrcをカスタマイズすることでシェルを効率的に使えるようになります。関数の他aliasによるカスタマイズも一般的のようなので、自分の好みに合った設定を探してみるといいかもしれません。
また、今回記事を書くに当たって本文中にリンクした多数の文献を参考にさせていただきました。ありがとうございました。