shfmt(1) ; To render and view: scdoc Language dialect (*bash*/*posix*/*mksh*/*bats*, default *auto*). When set to *auto*, the language is detected from the input filename, as long as it has a shell extension like *foo.mksh*. Otherwise, if the input begins with a shell shebang like *#!/bin/sh*, that's used instead. If neither come up with a result, *bash* is used as a fallback. The filename extension *.sh* is a special case: it implies *posix*, but may be overridden by a valid shell shebang. *-p*, *--posix* Shorthand for *-ln=posix*. *-s*, *--simplify* Simplify the code. ## Printer flags *-i*, *--indent* Indent: *0* for tabs (default), *>0* for number of spaces. *-bn*, *--binary-next-line* Binary ops like *&&* and *|* may start a line. *-ci*, *--case-indent* Switch cases will be indented. *-sr*, *--space-redirects* Redirect operators will be followed by a space. *-kp*, *--keep-padding* Keep column alignment paddings. This flag is *DEPRECATED* and will be removed in the next major version. For more information, see: https://github.com/mvdan/sh/issues/658 *-fn*, *--func-next-line* Function opening braces are placed on a separate line. *-mn*, *--minify* Minify the code to reduce its size (implies *-s*). ## Utility flags *-f[=0]*, *--find[=0]* Recursively find all shell files and print the paths; paths are separated by a newline or a null character if -f=0. *--to-json* Print syntax tree to stdout as a typed JSON. *--from-json* Read syntax tree from stdin as a typed JSON. # EXAMPLES Format all the scripts under the current directory, printing which are modified: shfmt -l -w . For CI, one can use a variant where formatting changes are just shown as diffs: shfmt -d . The following formatting flags closely resemble Google's shell style defined in : shfmt -i 2 -ci -bn Below is a sample EditorConfig file as defined by , showing how to set supported options: ``` [*.sh] # like -i=4 indent_style = space indent_size = 4 # --language-dialect shell_variant = posix simplify = true binary_next_line = true # --case-indent switch_case_indent = true space_redirects = true keep_padding = true # --func-next-line function_next_line = true minify = true # Ignore the entire "third_party" directory when calling shfmt on directories, # such as "shfmt -l -w .". When formatting files directly, # like "shfmt -w third_party/foo.sh" or "shfmt --filename=third_party/foo.sh", # the ignore logic is applied only when the --apply-ignore flag is given. [third_party/**] ignore = true ``` EditorConfig sections may also use `[[shell]]` or `[[bash]]` to match any shell or bash scripts, which is particularly useful when scripts use a shebang but no extension. Note that this feature is outside of the EditorConfig spec and may be changed in the future. 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í , who is assisted by other open source contributors. For more information and development, see .