bashumerate: Bash用のプログラマブルなイテレータ

bashumerate: Bash用のプログラマブルなイテレータ

bashumerateは統一された構文でシェルの反復処理を簡素化します

bashumerateは、forループ、find -exec、およびxargsのバラバラな構文を、単一の、一貫したインターフェースに置き換えるシェルのためのプログラマブルなイテレータです。{}プレースホルダーを使用し、統一されたコマンド構造を用いることで、ユーザーは、ファイル、行、範囲、リストといった複数のソースタイプを、ツール固有のフラグや引用符の癖を切り替えることなく反復処理することができます。

コア機能とソースタイプ

このツールは、一貫したパターンを使用します:enumerate [source_flag] [source] -- [command]{}プレースホルダーは、コマンド内で反復処理されている現在のアイテムを表すために使用されます。

サポートされているソース

Flag Source Example
-f Files enumerate -f '*.sh' -- 'wc -l {}'
-l Lines enumerate -l /etc/hosts -- 'echo {}'
-r Range enumerate -r 1 10 -- 'printf "n=%d\n" {}'
-L List enumerate -L a b c -- 'echo item: {}'

主な機能

  • Template Mode: コマンドをシングルクォートで囲むと、シェルテンプレートとして機能し、enumerate -f '*' -- 'cat {} | head -5'のような複雑なパイプを可能にします。
  • Filtering: 内蔵の--includeおよび--excludeフラグにより、ソースアイテムのグロブパターンによるフィルタリングが可能です。
  • NUL-Safety: NUL区切り出力用の-0フラグが提供されており、ファイル名にスペースや特殊文字が含まれていても反復処理が壊れないようにします。
  • Extensibility: ユーザーはlib/enumerators/にスクリプトをドロップすることで、カスタムソースを追加できます。enumerate_source_<name>という名前の関数は、自動的に有効なソースコマンドになります(例:enumerate docker -- 'docker restart {}')。

技術的実装

bashumerateは、約140行のBashで実装されています。内部的には、特殊文字に対する安全性を維持するために、ソースをNUL区切りストリームとして扱います。{}プレースホルダーはシェルレベルで置換されるため、基本的な置換のためにsedevalのトリックを使用することを避けています。

コミュニティによる批判と代替案

bashumerateはシェルの体験を簡素化することを目指していますが、経験豊富なUnixユーザー(Hacker Newsコミュニティ)は、いくつかの技術的な懸念事項を挙げ、既存の代替案を指摘しています。

技術的な懸念事項

批判的な意見を持つ人々は、このツールが新しい構文を学ぶ必要を生じさせ、同時にセキュリティや安定性のリスクを導入する可能性があると主張しています。具体的には、ユーザーは以下の点を指摘しています:

  • Quoting and Escaping: コマンドを単一の文字列として渡すと、特に反復アイテムが安全でない文字を含んでいる場合、複雑なエスケープ問題が発生する可能性があります。
  • Subshell Overhead: 別のツールであるため、常にサブシェルで実行されるため、ネイティブのBashループと比較してパフォーマンスに影響を与える可能性があります。
  • Redundancy: bashumerateが提供する機能の多くは、標準的なツールですでに利用可能です。例えば、元の投稿で言及された「ファイル名にスペースが含まれる」問題は、標準的なUnixではNUL終端によって解決されています:

find . -name '*.log' -print0 | xargs --null rm

推奨される代替案

より、堅牢または機能豊富な反復処理や並列化を求める人々のために、コミュニティは以下を提案しています:

  • GNU Parallel: 安全性のための--dry-runフラグを備えた、ジョブを並列実行するための強力なツールです。
  • Native Bash Loops: 最大限の制御と外部依存関係なしで実行するための、while readループの使用。
  • Modern Shells: 一部のユーザーは、PowerShellNushellのような、データをテキストストリームではなくオブジェクトとして扱うシェルへの移行を提案しています。これにより、bashumerateが解決しようとしている反復処理の問題を根本的に解決できます。

インストール

bashumerateは、basherマネージャー経由、またはリポジトリをクローンしてバイナリにシンボリックリンクを貼ることでインストールできます:

git clone https://github.com/wallach-game/bashumerate.git
ln -s "$PWD/bashumerate/bin/enumerate" ~/.local/bin/

Sources