Create beautiful bash scripts from simple YAML configuration.
$ gem install bashly In an empty directory, create a sample configuration file by running
$ bashly init # or, to generate a simpler configuration: $ bashly init --minimal This will create a sample src/bashly.yml file. You can edit this file to specify which arguments, flags and subcommands you need in your bash script.
Then, generate an initial bash script and function placeholder scripts by running
$ bashly generate This will:
- Create the bash executable script.
- Create files for you to edit in the
srcfolder.
Finally, edit the files in the src folder. Each of your script's commands get their own file. Once you edit, run bashly generate again to merge the content from your functions back into the script.
The bashly.yml file can be set up to generate two types of scripts:
- Script with subcommands (for example, like
dockerorgit). - Script without subcommands (for example, like
ls)
This is detected automatically by the contents of the configuration: If it contains a commands definition, it will generate a script with subcommands.
You can get this script by running bashly generate --minimal.
name: download help: Sample minimal application without subcommands version: 0.1.0 args: - name: source required: true help: URL to download from - name: target help: "Target filename (default: same as source)" flags: - long: --force short: -f help: Overwrite existing files examples: - download example.com - download example.com ./output -fYou can get this script by running bashly generate.
name: cli help: Sample application version: 0.1.0 environment_variables: API_KEY: Set your API key commands: - name: download short: d help: Download a file args: - name: source required: true help: URL to download from - name: target help: "Target filename (default: same as source)" flags: - long: --force short: -f help: Overwrite existing files examples: - cli download example.com - cli download example.com ./output -f environment_variables: DEFAULT_TARGET_LOCATION: Set the default location to download to - name: upload short: u help: Upload a file args: - name: source required: true help: File to upload flags: - long: --user short: -u arg: user help: Username to use for logging in required: true - long: --password short: -p arg: password help: Password to use for logging inWith the exception of version and commands (which define subcommands), everything else in this section is suitable both for the main script, and for any subcommand you define using commands.
# The name of the script or subcommand name: myscript # The header text to display when using --help # This can have multiple lines. In this case, the first line will be used as # summary wherever appropriate. help: a sample script generated with bashly # The string to display when using --version version: 0.1.0 # Specify an array of examples to show when using --help examples: - myscript download - myscript download --force # Specify an array of environment variables needed by your script # This is used purely for displaying in the help text (when using --help) environment_variable: VARIABLE_NAME: Variable help text # Specify the array of subcommands to generate. # Each subcommand will have its own args and flags. # If this is provided, then you cannot provide flags or args for the main # script. commands: - ... # Specify the array of positional arguments this script needs. # If this is provided, then you cannot provide commands for the main script. args: - ... # Specify the array of option flags this script needs. # If this is provided, then you cannot provide commands for the main script. flags: - ...The below configuration generates this argument:
Usage: myscript USER Arguments: USER Username to use for logging in The argument's value will be available to you as ${args[user]} in your bash function.
# The name of the argument. name: user # The message to display when using --help. # This can have multiple lines, but it is recommended to keep lines shorter # than ~70 characters, to avoid text wrapping in narrower terminals. help: Username to use for logging in # Specify if this argument is required. # Note that once you define an optional argument (without required: true) # then you cannot define required arguments after it. required: trueThe below configuration generates this flag:
-o, --output DIRECTORY (required) Specify the output directory The flags's value will be available to you as ${args[--output]} in your bash function (regardless of whether the user provided ut with the long or short form).
# The long form of the flag. long: --output # The short form of the flag. short: -o # The text to display when using --help # This can have multiple lines, but it is recommended to keep lines shorter # than ~70 characters, to avoid text wrapping in narrower terminals. help: Specify the output directory # If the flag requires an argument, specify its name here. arg: directory # Specify if this flag is required. required: trueIf you experience any issue, have a question or a suggestion, or if you wish to contribute, feel free to open an issue.