2,454 stars · MIT, read from /blob/master/LICENSE on 2026-09-28 after /blob/main/LICENSE returned 404; plain, copyright "(c) Danny Ben Shitrit" · v2.0.0 (2026-09-27), read from /releases/latest, confirmed by ungh and by the rubygems API, which records the gem as created 2026-09-27T09:37:33 UTC, seven minutes before the GitHub release · Track this in Scout
Describe a command-line tool's commands, arguments and flags in one YAML file and it generates a standalone shell script with the parsing, validation and help text written.
▶Repo detailsthe review · specs · pros & cons · install
What it is
A generator. You write a YAML file naming the commands, arguments and flags, run one command, and it emits a standalone shell script with the parsing, validation and help text already written. Your own logic lives in separate per-command files that the generator leaves alone.
What it is good for. Anyone whose useful scripts have become embarrassing. The moment a script needs two subcommands and a --dry-run flag, hand-written argument parsing turns into a wall of case statements nobody wants to touch. This removes that wall and keeps the result a plain shell script, so it still runs anywhere with no runtime to install.
- The output is one ordinary shell script. There is nothing to install on the machine that runs it, which is the whole reason for choosing shell in the first place.
- It ships a standard library: coloured output, settings files, YAML reading and shell completions, so those are not written by hand either.
- It is tightly kept. One open issue, and version 2.0.0 landed on 27 September 2026, the day before this edition.
- Version 2.0.0 is one day old. It is the least-tested release in the project's history, and it is a major version, so anyone on the 1.x line faces a migration. Its notes include swapping out a dependency and reworking completions.
- It needs Ruby 3.3 or newer to run the generator, which is an odd dependency for a shell tool and a real obstacle on older systems. The Docker route avoids that.
- The generated scripts need bash 4.2 or newer. That excludes the bash that ships with macOS by default, so macOS users install a newer bash first.
- matejak/argbash
1,487 stars, last code 17 July 2025; generates only the argument-parsing block, with no subcommand framework, no standard library and no completions.
Track this in Scout - ko1nksm/getoptions
522 stars, and its last code landed on 18 November 2024, about twenty-two months ago; a runtime library rather than a generator, and it works on shells other than bash.
Track this in Scout - docopt/docopts
523 stars, and its last code landed on 2 July 2024, about twenty-six months ago; it derives the parsing from the help text you write, which is the opposite direction, and does nothing else.
Track this in Scout
# as a Ruby gem gem install bashly # or with Homebrew brew install bashly # or with Docker, which avoids installing Ruby alias bashly='docker run --rm -it --user $(id -u):$(id -g) \ --volume "$PWD:/app" dannyben/bashly'

