I've built a tool called sol (like "soul") that helps you inspect and format complex shell one-liners. Features:<p>- Choose which transformations you want (break on pipe, args, redirect, whatever)<p>- "Peeks" into stringified commands (think xargs, parallel) and formats those, too<p>- Auto-breaks at a given width (e.g., 80 characters)<p>- Shows you non-standard aliases, functions, files, etc. that you might not have in your shell environment<p>- Breaks up long jq lines with jqfmt because—let's be honest—they're getting out of hand<p>As a security researcher and tool developer, I often encounter (or create) long pipelined Bash commands. While quick and powerful, they can be a nightmare to read or debug. I created sol to make it easier to understand and share these commands with others.
I usually do this by hand. Good to see a tool for it :-)<p>Feature request, which I would love to have in all my automation scripts:<p>Replace short flags with the long switches. Short flags are great when typing in a terminal but I don't want to figure out 2 years from now what the<p><pre><code> obscurecommand -v -f -n
</code></pre>
does, and I have to assume that it's NOT --version --file --dry-run, but --verbose, --force, and --dont-ask-before-deleting-everything<p>I try to use long options in my script, therefore (especially in a team, where not everyone is familiar with every single command)
Cool! My personal preference is Knuth-style line-breaks on binary operators and pipes, which means breaking before the operator/pipe symbol.<p><pre><code> foo -a -b \
| bar -c -d -e \
| baz -e -f
</code></pre>
instead of<p><pre><code> foo -a -b | \
bar -c -d -e | \
baz -e -f
</code></pre>
This doesn't seem to be an option, but could be easy to implement.
This is really cool; for a second I thought I could use it to stop manually maintaining both the minified and full-text versions of my “shell prefix” that makes it possible to run rust source code directly as if it were a shell script [0] where I’ve accidentally diverged between the two in the past, but then I revisited it and saw that the real value was in the comments and explanations more than just placing output in variables and breaking up command pipelines across shell lines.<p>But the opposite might work, does anyone have a good <i>minifier</i> they could recommend (preferably one that does more than just whitespace mangling, eg also renames variables, chains executions, etc) that doesn’t introduce bash-isms into the resulting script?<p>[0]: <a href="https://neosmart.net/blog/self-compiling-rust-code/" rel="nofollow">https://neosmart.net/blog/self-compiling-rust-code/</a>