rcmdnk's blog

EA Best Selections サブコマンド

Gitはgit <command>と言った形でサブコマンドを呼ぶことで様々な操作を行います。

サブコマンドは自分で定義することも出来て、PATHの通ったディレクトリにある実行ファイルのうち git-から始まる名前のものがgit-を外した形でサブコマンドとして追加されます。

Homebrewのbrewなんかでもbrew-で同じことが出来ます。

こんな感じのサブコマンドを持つメインコマンドをシェルスクリプトで 簡単に作れるshell-subcommand というものを作ってみました。

Sponsored Links

shell-subcommand

必要なファイルはbinにあるshell-subcommandというファイルです。

これを適当なところに置いてください。

$ wget https://raw.githubusercontent.com/rcmdnk/shell-subcommand/master/bin/shell-subcommand

なりshell-subcommand を直接ダウンロードしてどこかに置くなり。

使い方

取ってきたらメインコマンドの名前を付けたスクリプトを作ります。

最も単純なもので

mycmd
1
2
3
#!/usr/bin/env bash

source /path/to/shell-subcommand

と、shell-subcommandを呼ぶだけ。

これでPATH中にあるmycmd-XXXという実行ファイルを

$ mycmd XXX

と呼び出せる様になります。もちろんmycmd-XXXに引数がある場合はmycmd XXXに同様に渡せます。

alias/関数

さらにaliasや関数で定義されたももの呼ぶことが出来ます。

ただし、シェルスクリプトを呼ぶ際には親のシェルのaliasや関数は渡されないので 中で再定義してやる必要があります。

従って.bashrcで定義しているのであれば

mycmd
1
2
3
4
#!/usr/bin/env bash

source ~/.bashrc
source /path/to/shell-subcommand

と、shell-subcommandを呼ぶ前に呼んであげればOK。

もちろん、スクリプトの中で

mycmd
1
2
3
4
5
6
7
8
#!/usr/bin/env bash

alias mycmd-hello="echo Hello world!"
mycmd-hello-func () {
  echo "Hello, this is function!"
}
source /path/to/shell-subcommand
```

と言った感じに直接定義することも出来ます。

$ 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_HELPusage:…の部分で、

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というライブラリーを発表しています。

google/python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.

PythonだとArgparseとかを無理やり使ってサブコマンドを作ったりしていましたが、 これを使うと簡単にきれいにサブコマンドを使うツールを書くことができそうです。

Sponsored Links
Sponsored Links

« DHCPでホスト名が配られる環境にノートPCを持っていた時に起こった問題 shell-logger:シェルスクリプトでのログ整形、Traceback機能を追加 »