6 ポイント 投稿者 GN⁺ 2025-03-23 | 1件のコメント | WhatsAppで共有
  • 多くのコマンドラインユーティリティは、短い形式のオプション(-f)と長い形式のオプション(--force)をサポートしている
  • 短い形式は対話的な利用のためのものであり、スクリプトでは長い形式を使うことを推奨する
  • たとえば、ターミナルでは $ git switch -c my-new-branch と入力する。
  • リリーススクリプトでは次のように書く:
    • try shell.exec("git fetch origin --quiet", .{});
    • try shell.exec("git switch --create release-{today} origin/main", .{ .today = stdx.DateUTC.now() }, );
  • 長い形式のオプションは、読者にとってはるかに説明的である

1件のコメント

 
GN⁺ 2025-03-23
Hacker Newsの意見
  • 長いオプションを好むが、POSIXコマンドを移植性を保って呼び出す必要がある場合は、短いオプションだけが唯一の選択肢である。POSIXは長いオプションを規定していない

    • 例えば、diff の仕様を参照できる
    • 多くの場合、POSIXユーティリティに依存するよりも、ライブラリバインディングを使うほうがよりよい代替手段である
    • grep を呼び出す代わりに、libpcre のようなものを使うほうが効率的かもしれない
    • githgrgag などの非POSIXユーティリティでは、長いオプションを使うのは合理的である
  • 文字列補間とコマンド実行を混在させるべきではない

    • 特にコマンドがシェル経由で処理されるときは注意すべきである
    • どの言語であっても、リストベースまたは配列ベースの実行APIを使い、引数を execv(2)execvp(2) などに直接渡すべきである
  • 長いオプションを使うべきだという点には同意するが、移植性を考慮しなければならない

    • すべてのBSDディストリビューションがGNUスタイルの長いオプションをサポートしているわけではない
    • 移植性を求めるなら短いオプションを使うべきである
  • すべてのオプションの後、動的引数の前に -- を使うのを忘れてはならない

  • コマンドを呼び出す前に、コマンドの長さが ARG_MAX より長いかどうかを確認すべきである

    • 例えば、次のようなコマンドがあるとき:
      • grep --ignore-case --files-with-matches -- "hello" *.c
    • このように呼び出すべきである:
      • CMD="grep --ignore-case --files-with-matches -- \"hello\" *.c"
      • ARG_MAX=$(getconf ARG_MAX)
      • CMD_LEN=${#CMD}
      • if (( CMD_LEN > ARG_MAX )); then
      • echo "Error: Command length ($CMD_LEN) exceeds ARG_MAX ($ARG_MAX)." >&2
      • exit 1
      • fi
      • eval "$CMD" # 警告、ファイル名を評価する
  • この方法に同意する。もう一つの利点は、オプションが何をするのかをmanページでgrepしやすくなることだ

  • スクリプトを他のPOSIXシステムへ移植可能にしたいなら、短いオプションを使わなければならないかもしれない

    • 長いオプションは標準化されていない
    • 自分でトレードオフを判断すべきである
  • オプションは別々の行に置き、追跡や git blame をしやすくすべきである

  • スクリプトを書くときの基本ルールの一つである。長いオプションが使えるなら使うべきだ

    • そうするのはあまりにも合理的である
  • 長い形式のオプションは読者にとってはるかに説明的である

    • タイプミスも起こりにくい