Skip to main content

Beautysh 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) keywords can be used as variables. Years ago, while testing the first version of this program, I encountered this example:

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 just 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 many large Linux system Bash scripts, its error-free score was roughly 99%.

Installation

Simply run

pip install beautysh

or clone the repo and install:

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

Usage

Beautysh has three modes of operation:

  1. If presented with a list of file names —

    beautysh.py file1.sh file2.sh file3.sh

    — for each file name, it will create a backup (i.e. file1.sh~) and overwrite the original file with a beautified replacement.

  2. If given ‘-’ as a command-line argument, it will use stdin as its source and stdout as its sink:

    beautysh.py - < infile.sh > outfile.sh
  3. If called as a module, it will behave itself and not execute its main() function:

    #!/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 … well, among other things, a Bash script:

#!/bin/sh

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

As well as the more obvious example:

    $ beautysh.py *.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's behavior is undefined). So
please — back up your files, and don't treat Beautysh as though it
is a harmless utility. That's only true most of the time.

Beautysh handles Bash here-docs very carefully (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

Originally written by Paul Lutus

Metadata

Release files for beautysh 2.2.2

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 2.2.2
File Size Uploaded Provenance
beautysh-2.2.2.tar.gz 4.8 kB Without provenance Details

Release files / beautysh-2.2.2.tar.gz

Download URL beautysh-2.2.2.tar.gz
Size 4.8 kB
Tags Source
SHA-256 checksum
How to use checksums
8477d1e94156b2d8d49372ec5a9965232ee9e47b0fab1773c4953f3517ce5dd6
BLAKE2b-256 checksum
How to use checksums
f9c12bf643e87bb4bf421d59bd44d8a5803610b4cdbde2a728c4ecfb52416a84
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for beautysh 2.2.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

2.2.2 This release

1 release file No provenance

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