CLIツールのベターパターン/アンチパターンを教えてください


# 背景

PythonでCLIツールを作成しています。  
[aws-cli](https://github.com/aws/aws-
cli)のような、外部サービスにアクセスするCLIツールです。以下のようにコマンドを実行します。

[code]

    # ユーザusr1を登録
    $ mycli register_user --user_id usr1 --user_info "{'name': 'alice`}"
    
    # usr1,usr2,usr3に関する詳細情報を出力する
    $ mycli print_users --user_id usr1 usr2 usr3
    
[/code]

コマンドライン引数のパースには、[argparser](https://docs.python.org/ja/3/library/argparse.html)モジュールを利用しています。

# 悩んでいること

CLIツールのサブコマンドやオプションの設計に悩んでいます。  
例えば、以下のような内容です。

### サブコマンド名やオプション名の命名規則

  * アンダースコア区切り？ハイフン区切り？
  * 複数の値を受け取ることができる（1個でもOK）オプション名は単数形？複数形？ `--user alice bob` or `--users alice bob`

### オプション

  * 使わない方が良い（競合しやすい）オプション名（`-h`?）

### その他

  * 標準入力の使いどころ。ファイルで渡すか標準入力で渡すか
  * 引数の順番（例：コピー元、コピー先の順）

# 質問

CLIツールに関して、ベターパターンやアンチパターン、標準や慣習が記載されているサイトがありましたら、教えていただきたいです。  
「command line interface design pattern」で検索してみましが、私が期待するサイトが見つかりませんでした。




アンチ(ベター)パターンがあるのか分かりませんが、Linuxでよく使われるオプション名などは  
「linux command long option」などで検索すると参考になるかもしれません。

以下はあくまで個人的な意見として

>   * アンダースコア区切り？ハイフン区切り？
>   * 複数の値を受け取ることができる（1個でもOK）オプション名は単数形？複数形？
>

少しでもキーボードのタイプ数を減らしたいので、(Shiftキーを押しながらの)アンダースコアより **ハイフン区切り** 、複数の値を取りうる場合も
**単数形** を使いたいです。  
ただし後者は「1個または複数」の値を取りうる場合で、「常に複数」の値を取るなら複数形でもいいのかもしれません。

> 使わない方が良い（競合しやすい）オプション名（-h?）

オプションはそれぞれのコマンドが解釈するものなはずなので、「競合」という状態がよく分からないです。そのコマンドで必要なオプションが自然と説明できる名前を付ければいいのではないでしょうか。

おっしゃる通り`-h`はヘルプ表示によく使われますが、他にも「引数なしでコマンド実行」や「manマニュアル」などでヘルプを提供する場合もあり、`-h
HOSTNAME`のように他の意味に割り当てているコマンドもあります。

> 標準入力の使いどころ。ファイルで渡すか標準入力で渡すか

**そのコマンドがどのように振る舞うのか次第** ではないでしょうか (パイプラインで繋いで他のコマンドから入力を受け取りたいのか否か)。

> 引数の順番（例：コピー元、コピー先の順）

例に挙げられた「コピー」などの例は「元、先」の順がほとんどなので、似た動作を行うコマンドを想定しているなら、既存のコマンドに習うべきでしょう。  
利用するユーザーも既存の知識をベースにコマンドが振る舞うことを期待すると思うので、ここで齟齬があると実行するコマンドによっては取り返しのつかない不幸が簡単に起きます。




アンチ(ベター)パターンがあるのか分かりませんが、Linuxでよく使われるオプション名などは  
「linux command long option」などで検索すると参考になるかもしれません。

以下はあくまで個人的な意見として

>   * アンダースコア区切り？ハイフン区切り？
>   * 複数の値を受け取ることができる（1個でもOK）オプション名は単数形？複数形？
>

少しでもキーボードのタイプ数を減らしたいので、(Shiftキーを押しながらの)アンダースコアより **ハイフン区切り** 、複数の値を取りうる場合も
**単数形** を使いたいです。  
ただし後者は「1個または複数」の値を取りうる場合で、「常に複数」の値を取るなら複数形でもいいのかもしれません。

> 使わない方が良い（競合しやすい）オプション名（-h?）

オプションはそれぞれのコマンドが解釈するものなはずなので、「競合」という状態がよく分からないです。そのコマンドで必要なオプションが自然と説明できる名前を付ければいいのではないでしょうか。

おっしゃる通り`-h`はヘルプ表示によく使われますが、他にも「引数なしでコマンド実行」や「manマニュアル」などでヘルプを提供する場合もあり、`-h
HOSTNAME`のように他の意味に割り当てているコマンドもあります。

> 標準入力の使いどころ。ファイルで渡すか標準入力で渡すか

**そのコマンドがどのように振る舞うのか次第** ではないでしょうか (パイプラインで繋いで他のコマンドから入力を受け取りたいのか否か)。

> 引数の順番（例：コピー元、コピー先の順）

例に挙げられた「コピー」などの例は「元、先」の順がほとんどなので、似た動作を行うコマンドを想定しているなら、既存のコマンドに習うべきでしょう。  
利用するユーザーも既存の知識をベースにコマンドが振る舞うことを期待すると思うので、ここで齟齬があると実行するコマンドによっては取り返しのつかない不幸が簡単に起きます。

