shfmt(1) | General Commands Manual | shfmt(1) |
NAME¶
shfmt - Format shell programs
SYNOPSIS¶
shfmt [flags] [path...]
DESCRIPTION¶
shfmt formats shell programs. If the only argument is a dash (-) or no arguments are given, standard input will be used. If a given path is a directory, all shell scripts found under that directory will be used.
If any EditorConfig files are found, they will be used to apply formatting options. If any parser or printer flags are given to the tool, no EditorConfig files will be used. A default like -i=0 can be used for this purpose.
shfmt's default shell formatting was chosen to be consistent, common, and predictable. Some aspects of the format can be configured via printer flags.
OPTIONS¶
Generic flags¶
-version
-l
-w
-d
The diff uses color when the output is a terminal. To never use color, set a non-empty NO_COLOR or TERM=dumb. To always use color, set a non-empty FORCE_COLOR.
-s
-mn
Parser flags¶
-ln <str>
-p
-filename str
Printer flags¶
-i <uint>
-bn
-ci
-sr
-kp
-fn
Utility flags¶
-f
-tojson
EXAMPLES¶
Format all the scripts under the current directory, printing which are modified:
For CI, one can use a variant where formatting changes are just shown as diffs:
The following formatting flags closely resemble Google's shell style defined in <https://google.github.io/styleguide/shell.xml>:
Below is a sample EditorConfig file as defined by <https://editorconfig.org/>, showing how to set any option:
[*.sh] # like -i=4 indent_style = space indent_size = 4 shell_variant = posix # like -ln=posix binary_next_line = true # like -bn switch_case_indent = true # like -ci space_redirects = true # like -sr keep_padding = true # like -kp function_next_line = true # like -fn # Ignore the entire "third_party" directory. [third_party/**] ignore = true
shfmt can also replace bash -n to check shell scripts for syntax errors. It is more exhaustive, as it parses all syntax statically and requires valid UTF-8:
$ echo '${foo:1 2}' | bash -n $ echo '${foo:1 2}' | shfmt >/dev/null 1:9: not a valid arithmetic operator: 2 $ echo 'foo=(1 2)' | bash --posix -n $ echo 'foo=(1 2)' | shfmt -p >/dev/null 1:5: arrays are a bash feature
AUTHORS¶
Maintained by Daniel Martí <mvdan@mvdan.cc>, who is assisted by other open source contributors. For more information and development, see <https://github.com/mvdan/sh>.
2021-12-13 |