Skip to main content

Beautysh Build Status

This program takes upon itself the hard task of beautifying Bash scripts (yeesh). Processing Bash scripts is not trivial, they aren't like C or Java programs — they have a lot of ambiguous syntax, and (shudder) you can use keywords as variables. Years ago, while testing the first version of this program, I encountered this example:

while true; do done=3; echo done; done

Same name, but three distinct meanings (sigh). The Bash interpreter can sort out this perversity, but I decided not to try to recreate the Bash interpreter to beautify a script. This means there will be some border cases this Python program won't be able to process. But in tests with large Linux system Bash scripts, its error-free score was ~99%.

Installation

If you have pip set up you can do

pip install beautysh

or clone the repo and install:

git clone https://github.com/bemeurer/beautysh
cd beautysh
python setup.py install

Usage

You can call Beautysh from the command line such as

beautysh.py -f file1.sh file2.sh file3.sh

in which case it will beautify each one of the files.

Available flags are:

  --indent-size INDENT_SIZE, -i INDENT_SIZE
                        Sets the number of spaces to be used in indentation.
  --files [FILES [FILES ...]], -f [FILES [FILES ...]]
                        Files to be beautified. This is mandatory. If - is
                        provided as filename, then beautysh reads from stdin
                        and writes on stdout.
  --backup, -b          Beautysh will create a backup file in the same path as
                        the original.
  --check, -c           Beautysh will just check the files without doing any
                        in-place beautify.
  --tab, -t             Sets indentation to tabs instead of spaces.
  --force-function-style FORCE_FUNCTION_STYLE, -s FORCE_FUNCTION_STYLE
                        Force a specific Bash function formatting. See below
                        for more info.
  --version, -v         Prints the version and exits.
  --help, -h            Print this help message.

Bash function styles that can be specified via --force-function-style are:
  fnpar: function keyword, open/closed parentheses, e.g.      function foo()
  fnonly: function keyword, no open/closed parentheses, e.g.  function foo
  paronly: no function keyword, open/closed parentheses, e.g. foo()

Example of use to reformat stdin and print on stdout:

beautysh.py - < infile.sh > outfile.sh

You can also call beautysh as a module:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from beautysh import Beautysh

[ ... ]

result,error = Beautysh().beautify_string(source)

As written, beautysh can beautify large numbers of Bash scripts when called from a variety of means,including a Bash script:

#!/bin/sh

for path in `find /path -name '*.sh'`
do
   beautysh.py -f $path
done

As well as the more obvious example:

$ beautysh.py -f *.sh

CAUTION: Because Beautysh overwrites all the files submitted to it, this could have disastrous consequences if the files include some of the increasingly common Bash scripts that have appended binary content (a regime where Beautysh has undefined behaviour ). So please — back up your files, and don't treat Beautysh as a harmless utility. Even if that is true most of the time.

Beautysh handles Bash here-docs with care(and there are probably some border cases it doesn't handle). The basic idea is that the originator knew what format he wanted in the here-doc, and a beautifier shouldn't try to outguess him. So Beautysh does all it can to pass along the here-doc content unchanged:

if true
then

   echo "Before here-doc"

   # Insert 2 lines in file, then save.
   #--------Begin here document-----------#
vi $TARGETFILE <<x23LimitStringx23
i
This is line 1 of the example file.
This is line 2 of the example file.
^[
ZZ
x23LimitStringx23
   #----------End here document-----------#

   echo "After here-doc"

fi

Special comments @formatter:off and @formatter:on are available to disable formatting around a block of statements.

# @formatter:off
command \
    --option1 \
        --option2 \
            --option3 \
# @formatter:on

This takes inspiration from the Eclipse feature.


Originally written by Paul Lutus

Release files for beautysh 4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for beautysh 4.0
File Size Uploaded
beautysh-4.0.macosx-10.14-x86_64.tar.gz 11.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for beautysh 4.0
File Interpreter ABI Platform
beautysh-4.0-py3-none-any.whl Python 3 none any Details

Total release size: 20.8 kB

Release files / beautysh-4.0.macosx-10.14-x86_64.tar.gz

Download URL beautysh-4.0.macosx-10.14-x86_64.tar.gz
Size 11.4 kB
Tags Source
SHA-256 checksum
How to use checksums
60a532a59acbbbdb0991031b078d130e26a72c9c91dcedf8795d16d96ce921da
BLAKE2b-256 checksum
How to use checksums
ed3e21f8ed9ee21275d66d1768193e55547b19a3042418f5271fd10a45fed86e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.2

Release files / beautysh-4.0-py3-none-any.whl

Download URL beautysh-4.0-py3-none-any.whl
Size 9.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cb1f4e219dae5402a4cf2913dd140028c5d9bfb6609edf4796679fe62b1acb46
BLAKE2b-256 checksum
How to use checksums
089e1a9505297ffab221d3a023517727ece26a8890f01b7b864e42520fa3b4f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.2

Release history Release notifications | RSS feed

6.4.3

2 release files

6.4.2

2 release files

6.4.1

2 release files

6.4.0

2 release files

6.3.3

2 release files

6.3.2

2 release files

6.3.1

2 release files

6.3.0

2 release files

6.2.1

2 release files

6.2.0

2 release files

6.1.0

2 release files

6.0.1

1 release file

6.0.0

1 release file

5.0.2

1 release file

5.0.1

1 release file

5.0.0

1 release file

4.1

3 release files

This release

4.0 This release

2 release files

3.12

1 release file

3.11

2 release files

3.10

2 release files

3.9

2 release files

3.8

1 release file

3.7

1 release file

3.6

1 release file

3.5

1 release file

3.4

1 release file

3.3

1 release file

3.2

1 release file

3.1

1 release file

3.0

1 release file

2.2.2

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page