Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lovesegfault/beautysh
A Bash beautifier for the masses.
https://github.com/lovesegfault/beautysh
Last synced: about 2 hours ago
JSON representation
A Bash beautifier for the masses.
- Host: GitHub
- URL: https://github.com/lovesegfault/beautysh
- Owner: lovesegfault
- License: mit
- Created: 2016-02-21T16:46:12.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-11-01T00:07:26.000Z (13 days ago)
- Last Synced: 2024-11-06T14:13:45.732Z (7 days ago)
- Language: Python
- Homepage: https://pypi.python.org/pypi/beautysh
- Size: 352 KB
- Stars: 453
- Watchers: 5
- Forks: 42
- Open Issues: 38
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Beautysh [![CI](https://github.com/lovesegfault/beautysh/actions/workflows/ci.yaml/badge.svg)](https://github.com/lovesegfault/beautysh/actions/workflows/ci.yaml)
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:```shell
done=0;while (( $done <= 10 ));do echo done=$done;done=$((done+1));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
```shell
pip install beautysh
```or clone the repo and install:
```shell
git clone https://github.com/lovesegfault/beautysh
cd beautysh
poetry install
```## Usage
You can call Beautysh from the command line such as
```shell
beautysh 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.
--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()
```You can also call beautysh as a module:
```python3
from beautysh import Beautifysource = "my_string"
result, error = Beautify().beautify_string(source)
```As written, beautysh can beautify large numbers of Bash scripts when called
from a variety of means,including a Bash script:```shell
#!/bin/shfor path in `find /path -name '*.sh'`
do
beautysh $path
done
```As well as the more obvious example:
```shell
$ beautysh *.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:```shell
if true
thenecho "Before here-doc"
# Insert 2 lines in file, then save.
#--------Begin here document-----------#
vi $TARGETFILE <