fish shellのオプション解析の書き方

概要

fish shellは素晴らしくモダンなshellです。オプション解析もbashと比べると驚くほど簡単にかけます。 fish shellにはargparseというオプション解析用のコマンドが用意されています。今回はその使い方の紹介をします。argparse単体でも十分に便利ですが、fish_optというargparseに渡すべき引数を生成する補助ツールも用意されているので、覚えることが少なく、あとからも読みやすくなっています。

argparseの使い方

以下のサンプルを見るとだいたいのことはわかると思います。 使用しているものは以下の2つです。 1行ごとにコマンドを定義できるので、読みやすく、自動で_flag_{flag}という変数が生成されるので、手間も少ないです。

  • argparse: オプション解析ツール
  • fish_opt: オプション解析ツールに渡すべき引数を生成するコマンド(使わなくても良い)
function main
  set -l options (fish_opt --short=h --long=help)
  set options $options (fish_opt -s a -l algo -r)
  set options $options (fish_opt --short=f --long=file --required-val)
  argparse -n mycmdname $options -- $argv
  or return
  if set -lq _flag_h
    echo "show help"
  end
end

main $argv

fish_optは以下のような動作を行っています。

fish_opt --short=h --long=help
>>> h/help

fish_opt -s a -l algo -r 
>>> a/algo=

なのでfish_optを用いずとも以下のように書くことができます。

function main
  argparse -n mycmdname h/help a/algo= f/file= -- $argv
  or return
  if set -lq _flag_h
    echo "show help"
  end
end

main $argv

ここで、=がついていると引数を取るオプションであるという意味になります。 fish_optを用いる場面としては、longオプションのみを有効化したい等の細かい引数の設定をしたい場合です。 直接上のようにもかけるのですが、その書式を覚えるのが大変なのでfish_optを用いると便利になります。 fish_optを用いるとオプションの定義が自然と1行ごとになるので、個人的にはそこもメリットかと思っています。