Gitはgit <command>
と言った形でサブコマンドを呼ぶことで様々な操作を行います。
サブコマンドは自分で定義することも出来て、PATHの通ったディレクトリにある実行ファイルのうち
git-
から始まる名前のものがgit-
を外した形でサブコマンドとして追加されます。
Homebrewのbrew
なんかでもbrew-
で同じことが出来ます。
こんな感じのサブコマンドを持つメインコマンドをシェルスクリプトで 簡単に作れるshell-subcommand というものを作ってみました。
shell-subcommand
必要なファイルはbinにあるshell-subcommand
というファイルです。
これを適当なところに置いてください。
$ wget https://raw.githubusercontent.com/rcmdnk/shell-subcommand/master/bin/shell-subcommand
なりshell-subcommand を直接ダウンロードしてどこかに置くなり。
使い方
取ってきたらメインコマンドの名前を付けたスクリプトを作ります。
最も単純なもので
1 2 3 |
|
と、shell-subcommand
を呼ぶだけ。
これでPATH中にあるmycmd-XXX
という実行ファイルを
$ mycmd XXX
と呼び出せる様になります。もちろんmycmd-XXX
に引数がある場合はmycmd XXX
に同様に渡せます。
alias/関数
さらにaliasや関数で定義されたももの呼ぶことが出来ます。
ただし、シェルスクリプトを呼ぶ際には親のシェルのaliasや関数は渡されないので 中で再定義してやる必要があります。
従って.bashrcで定義しているのであれば
1 2 3 4 |
|
と、shell-subcommand
を呼ぶ前に呼んであげればOK。
もちろん、スクリプトの中で
1 2 3 4 5 6 7 8 |
|
と言った感じに直接定義することも出来ます。
$ mycmd
usage: mycmd <sub-commands> [options]
sub commands: hello hello-func help
$ mycmd hello
Hello world!
ヘルプを変更
SHORT_DESCRIPTOIN
, MAIN_HELP
という2つの変数を設定することでヘルプを変更できます。
SHORT_DESCRIPTOIN
は短い説明で
SHORT_DESCRIPTION="My command with various sub commands!"
とか設定すると
$ mycmd
mycmd: My command with various sub commands!
usage: mycmd <sub-commands> [options]
sub commands: hello hello-func help
の様に最初に説明が加わります。
MAIN_HELP
はusage:…の部分で、
HELP_MAIN="usage: $(basename "$0") <sub-commands> [options]
sub-commands are made from alias, function, and executables in PATH."
みたいに設定すれば
$ mycmd
mycmd: My command with various sub commands!
usage: mycmd <sub-commands> [options]
sub-commands are made from alias, function, and executables in PATH.
sub commands: hello hello-func help
と言った感じで変更できます。
さらにはHELP
という変数そのものを変更して全体を直接設定することも出来ます。
まとめ
まあ使う場面がどれだけあるかわかりませんが、 ちょっと作ってみた次第です。
似たようなもの(というのはおこがましいですが) GoogleがPythonでコマンドラインインターフェースを簡単に作れる Python Fireというライブラリーを発表しています。
PythonだとArgparseとかを無理やり使ってサブコマンドを作ったりしていましたが、 これを使うと簡単にきれいにサブコマンドを使うツールを書くことができそうです。