| .\" Automatically generated by Pandoc 2.2.1 |
| .\" |
| .TH "SHELLCHECK" "1" "" "Shell script analysis tool" "" |
| .hy |
| .SH NAME |
| .PP |
| shellcheck \- Shell script analysis tool |
| .SH SYNOPSIS |
| .PP |
| \f[B]shellcheck\f[] [\f[I]OPTIONS\f[]...] \f[I]FILES\f[]... |
| .SH DESCRIPTION |
| .PP |
| ShellCheck is a static analysis and linting tool for sh/bash scripts. |
| It\[aq]s mainly focused on handling typical beginner and intermediate |
| level syntax errors and pitfalls where the shell just gives a cryptic |
| error message or strange behavior, but it also reports on a few more |
| advanced issues where corner cases can cause delayed failures. |
| .PP |
| ShellCheck gives shell specific advice. |
| Consider this line: |
| .IP |
| .nf |
| \f[C] |
| ((\ area\ =\ 3.14*r*r\ )) |
| \f[] |
| .fi |
| .IP \[bu] 2 |
| For scripts starting with \f[C]#!/bin/sh\f[] (or when using |
| \f[C]\-s\ sh\f[]), ShellCheck will warn that \f[C]((\ ..\ ))\f[] is not |
| POSIX compliant (similar to checkbashisms). |
| .IP \[bu] 2 |
| For scripts starting with \f[C]#!/bin/bash\f[] (or using |
| \f[C]\-s\ bash\f[]), ShellCheck will warn that decimals are not |
| supported. |
| .IP \[bu] 2 |
| For scripts starting with \f[C]#!/bin/ksh\f[] (or using |
| \f[C]\-s\ ksh\f[]), ShellCheck will not warn at all, as \f[C]ksh\f[] |
| supports decimals in arithmetic contexts. |
| .SH OPTIONS |
| .TP |
| .B \f[B]\-a\f[],\ \f[B]\-\-check\-sourced\f[] |
| Emit warnings in sourced files. |
| Normally, \f[C]shellcheck\f[] will only warn about issues in the |
| specified files. |
| With this option, any issues in sourced files will also be reported. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-C\f[][\f[I]WHEN\f[]],\ \f[B]\-\-color\f[][=\f[I]WHEN\f[]] |
| For TTY output, enable colors \f[I]always\f[], \f[I]never\f[] or |
| \f[I]auto\f[]. |
| The default is \f[I]auto\f[]. |
| \f[B]\-\-color\f[] without an argument is equivalent to |
| \f[B]\-\-color=always\f[]. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-i\f[]\ \f[I]CODE1\f[][,\f[I]CODE2\f[]...],\ \f[B]\-\-include=\f[]\f[I]CODE1\f[][,\f[I]CODE2\f[]...] |
| Explicitly include only the specified codes in the report. |
| Subsequent \f[B]\-i\f[] options are cumulative, but all the codes can be |
| specified at once, comma\-separated as a single argument. |
| Include options override any provided exclude options. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-e\f[]\ \f[I]CODE1\f[][,\f[I]CODE2\f[]...],\ \f[B]\-\-exclude=\f[]\f[I]CODE1\f[][,\f[I]CODE2\f[]...] |
| Explicitly exclude the specified codes from the report. |
| Subsequent \f[B]\-e\f[] options are cumulative, but all the codes can be |
| specified at once, comma\-separated as a single argument. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-f\f[] \f[I]FORMAT\f[], \f[B]\-\-format=\f[]\f[I]FORMAT\f[] |
| Specify the output format of shellcheck, which prints its results in the |
| standard output. |
| Subsequent \f[B]\-f\f[] options are ignored, see \f[B]FORMATS\f[] below |
| for more information. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-\-list\-optional\f[] |
| Output a list of known optional checks. |
| These can be enabled with \f[B]\-o\f[] flags or \f[B]enable\f[] |
| directives. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-\-norc\f[] |
| Don\[aq]t try to look for .shellcheckrc configuration files. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-o\f[]\ \f[I]NAME1\f[][,\f[I]NAME2\f[]...],\ \f[B]\-\-enable=\f[]\f[I]NAME1\f[][,\f[I]NAME2\f[]...] |
| Enable optional checks. |
| The special name \f[I]all\f[] enables all of them. |
| Subsequent \f[B]\-o\f[] options accumulate. |
| This is equivalent to specifying \f[B]enable\f[] directives. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-P\f[]\ \f[I]SOURCEPATH\f[],\ \f[B]\-\-source\-path=\f[]\f[I]SOURCEPATH\f[] |
| Specify paths to search for sourced files, separated by \f[C]:\f[] on |
| Unix and \f[C];\f[] on Windows. |
| This is equivalent to specifying \f[C]search\-path\f[] directives. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-s\f[]\ \f[I]shell\f[],\ \f[B]\-\-shell=\f[]\f[I]shell\f[] |
| Specify Bourne shell dialect. |
| Valid values are \f[I]sh\f[], \f[I]bash\f[], \f[I]dash\f[] and |
| \f[I]ksh\f[]. |
| The default is to deduce the shell from the file\[aq]s \f[C]shell\f[] |
| directive, shebang, or \f[C]\&.bash/.bats/.dash/.ksh/.ebuild/.eclass\f[] |
| extension, in that order. |
| \f[I]sh\f[] refers to POSIX \f[C]sh\f[] (not the system\[aq]s), and will |
| warn of portability issues. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-S\f[]\ \f[I]SEVERITY\f[],\ \f[B]\-\-severity=\f[]\f[I]severity\f[] |
| Specify minimum severity of errors to consider. |
| Valid values in order of severity are \f[I]error\f[], \f[I]warning\f[], |
| \f[I]info\f[] and \f[I]style\f[]. |
| The default is \f[I]style\f[]. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-V\f[],\ \f[B]\-\-version\f[] |
| Print version information and exit. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-W\f[] \f[I]NUM\f[],\ \f[B]\-\-wiki\-link\-count=NUM\f[] |
| For TTY output, show \f[I]NUM\f[] wiki links to more information about |
| mentioned warnings. |
| Set to 0 to disable them entirely. |
| .RS |
| .RE |
| .TP |
| .B \f[B]\-x\f[],\ \f[B]\-\-external\-sources\f[] |
| Follow \[aq]source\[aq] statements even when the file is not specified |
| as input. |
| By default, \f[C]shellcheck\f[] will only follow files specified on the |
| command line (plus \f[C]/dev/null\f[]). |
| This option allows following any file the script may \f[C]source\f[]. |
| .RS |
| .RE |
| .TP |
| .B \f[B]FILES...\f[] |
| One or more script files to check, or "\-" for standard input. |
| .RS |
| .RE |
| .SH FORMATS |
| .TP |
| .B \f[B]tty\f[] |
| Plain text, human readable output. |
| This is the default. |
| .RS |
| .RE |
| .TP |
| .B \f[B]gcc\f[] |
| GCC compatible output. |
| Useful for editors that support compiling and showing syntax errors. |
| .RS |
| .PP |
| For example, in Vim, |
| \f[C]:set\ makeprg=shellcheck\\\ \-f\\\ gcc\\\ %\f[] will allow using |
| \f[C]:make\f[] to check the script, and \f[C]:cnext\f[] to jump to the |
| next error. |
| .IP |
| .nf |
| \f[C] |
| <file>:<line>:<column>:\ <type>:\ <message> |
| \f[] |
| .fi |
| .RE |
| .TP |
| .B \f[B]checkstyle\f[] |
| Checkstyle compatible XML output. |
| Supported directly or through plugins by many IDEs and build monitoring |
| systems. |
| .RS |
| .IP |
| .nf |
| \f[C] |
| <?xml\ version=\[aq]1.0\[aq]\ encoding=\[aq]UTF\-8\[aq]?> |
| <checkstyle\ version=\[aq]4.3\[aq]> |
| \ \ <file\ name=\[aq]file\[aq]> |
| \ \ \ \ <error |
| \ \ \ \ \ \ line=\[aq]line\[aq] |
| \ \ \ \ \ \ column=\[aq]column\[aq] |
| \ \ \ \ \ \ severity=\[aq]severity\[aq] |
| \ \ \ \ \ \ message=\[aq]message\[aq] |
| \ \ \ \ \ \ source=\[aq]ShellCheck.SC####\[aq]\ /> |
| \ \ \ \ ... |
| \ \ </file> |
| \ \ ... |
| </checkstyle> |
| \f[] |
| .fi |
| .RE |
| .TP |
| .B \f[B]diff\f[] |
| Auto\-fixes in unified diff format. |
| Can be piped to \f[C]git\ apply\f[] or \f[C]patch\ \-p1\f[] to |
| automatically apply fixes. |
| .RS |
| .IP |
| .nf |
| \f[C] |
| \-\-\-\ a/test.sh |
| +++\ b/test.sh |
| \@\@\ \-2,6\ +2,6\ \@\@ |
| \ ##\ Example\ of\ a\ broken\ script. |
| \ for\ f\ in\ $(ls\ *.m3u) |
| \ do |
| \-\ \ grep\ \-qi\ hq.*mp3\ $f\ \\ |
| +\ \ grep\ \-qi\ hq.*mp3\ "$f"\ \\ |
| \ \ \ \ \ &&\ echo\ \-e\ \[aq]Playlist\ $f\ contains\ a\ HQ\ file\ in\ mp3\ format\[aq] |
| \ done |
| \f[] |
| .fi |
| .RE |
| .TP |
| .B \f[B]json1\f[] |
| Json is a popular serialization format that is more suitable for web |
| applications. |
| ShellCheck\[aq]s json is compact and contains only the bare minimum. |
| Tabs are counted as 1 character. |
| .RS |
| .IP |
| .nf |
| \f[C] |
| { |
| \ \ comments:\ [ |
| \ \ \ \ { |
| \ \ \ \ \ \ "file":\ "filename", |
| \ \ \ \ \ \ "line":\ lineNumber, |
| \ \ \ \ \ \ "column":\ columnNumber, |
| \ \ \ \ \ \ "level":\ "severitylevel", |
| \ \ \ \ \ \ "code":\ errorCode, |
| \ \ \ \ \ \ "message":\ "warning\ message" |
| \ \ \ \ }, |
| \ \ \ \ ... |
| \ \ ] |
| } |
| \f[] |
| .fi |
| .RE |
| .TP |
| .B \f[B]json\f[] |
| This is a legacy version of the \f[B]json1\f[] format. |
| It\[aq]s a raw array of comments, and all offsets have a tab stop of 8. |
| .RS |
| .RE |
| .TP |
| .B \f[B]quiet\f[] |
| Suppress all normal output. |
| Exit with zero if no issues are found, otherwise exit with one. |
| Stops processing after the first issue. |
| .RS |
| .RE |
| .SH DIRECTIVES |
| .PP |
| ShellCheck directives can be specified as comments in the shell script. |
| If they appear before the first command, they are considered file\-wide. |
| Otherwise, they apply to the immediately following command or block: |
| .IP |
| .nf |
| \f[C] |
| #\ shellcheck\ key=value\ key=value |
| command\-or\-structure |
| \f[] |
| .fi |
| .PP |
| For example, to suppress SC2035 about using \f[C]\&./*.jpg\f[]: |
| .IP |
| .nf |
| \f[C] |
| #\ shellcheck\ disable=SC2035 |
| echo\ "Files:\ "\ *.jpg |
| \f[] |
| .fi |
| .PP |
| To tell ShellCheck where to look for an otherwise dynamically determined |
| file: |
| .IP |
| .nf |
| \f[C] |
| #\ shellcheck\ source=./lib.sh |
| source\ "$(find_install_dir)/lib.sh" |
| \f[] |
| .fi |
| .PP |
| Here a shell brace group is used to suppress a warning on multiple |
| lines: |
| .IP |
| .nf |
| \f[C] |
| #\ shellcheck\ disable=SC2016 |
| { |
| \ \ echo\ \[aq]Modifying\ $PATH\[aq] |
| \ \ echo\ \[aq]PATH=foo:$PATH\[aq]\ >>\ ~/.bashrc |
| } |
| \f[] |
| .fi |
| .PP |
| Valid keys are: |
| .TP |
| .B \f[B]disable\f[] |
| Disables a comma separated list of error codes for the following |
| command. |
| The command can be a simple command like \f[C]echo\ foo\f[], or a |
| compound command like a function definition, subshell block or loop. |
| .RS |
| .RE |
| .TP |
| .B \f[B]enable\f[] |
| Enable an optional check by name, as listed with |
| \f[B]\-\-list\-optional\f[]. |
| Only file\-wide \f[C]enable\f[] directives are considered. |
| .RS |
| .RE |
| .TP |
| .B \f[B]source\f[] |
| Overrides the filename included by a \f[C]source\f[]/\f[C]\&.\f[] |
| statement. |
| This can be used to tell shellcheck where to look for a file whose name |
| is determined at runtime, or to skip a source by telling it to use |
| \f[C]/dev/null\f[]. |
| .RS |
| .RE |
| .TP |
| .B \f[B]source\-path\f[] |
| Add a directory to the search path for \f[C]source\f[]/\f[C]\&.\f[] |
| statements (by default, only ShellCheck\[aq]s working directory is |
| included). |
| Absolute paths will also be rooted in these paths. |
| The special path \f[C]SCRIPTDIR\f[] can be used to specify the currently |
| checked script\[aq]s directory, as in \f[C]source\-path=SCRIPTDIR\f[] or |
| \f[C]source\-path=SCRIPTDIR/../libs\f[]. |
| Multiple paths accumulate, and \f[C]\-P\f[] takes precedence over them. |
| .RS |
| .RE |
| .TP |
| .B \f[B]shell\f[] |
| Overrides the shell detected from the shebang. |
| This is useful for files meant to be included (and thus lacking a |
| shebang), or possibly as a more targeted alternative to |
| \[aq]disable=2039\[aq]. |
| .RS |
| .RE |
| .SH RC FILES |
| .PP |
| Unless \f[C]\-\-norc\f[] is used, ShellCheck will look for a file |
| \f[C]\&.shellcheckrc\f[] or \f[C]shellcheckrc\f[] in the script\[aq]s |
| directory and each parent directory. |
| If found, it will read \f[C]key=value\f[] pairs from it and treat them |
| as file\-wide directives. |
| .PP |
| Here is an example \f[C]\&.shellcheckrc\f[]: |
| .IP |
| .nf |
| \f[C] |
| #\ Look\ for\ \[aq]source\[aq]d\ files\ relative\ to\ the\ checked\ script, |
| #\ and\ also\ look\ for\ absolute\ paths\ in\ /mnt/chroot |
| source\-path=SCRIPTDIR |
| source\-path=/mnt/chroot |
| |
| #\ Turn\ on\ warnings\ for\ unquoted\ variables\ with\ safe\ values |
| enable=quote\-safe\-variables |
| |
| #\ Turn\ on\ warnings\ for\ unassigned\ uppercase\ variables |
| enable=check\-unassigned\-uppercase |
| |
| #\ Allow\ using\ `which`\ since\ it\ gives\ full\ paths\ and\ is\ common\ enough |
| disable=SC2230 |
| \f[] |
| .fi |
| .PP |
| If no \f[C]\&.shellcheckrc\f[] is found in any of the parent |
| directories, ShellCheck will look in \f[C]~/.shellcheckrc\f[] followed |
| by the XDG config directory (usually \f[C]~/.config/shellcheckrc\f[]) on |
| Unix, or \f[C]%APPDATA%/shellcheckrc\f[] on Windows. |
| Only the first file found will be used. |
| .PP |
| Note for Snap users: the Snap sandbox disallows access to hidden files. |
| Use \f[C]shellcheckrc\f[] without the dot instead. |
| .PP |
| Note for Docker users: ShellCheck will only be able to look for files |
| that are mounted in the container, so \f[C]~/.shellcheckrc\f[] will not |
| be read. |
| .SH ENVIRONMENT VARIABLES |
| .PP |
| The environment variable \f[C]SHELLCHECK_OPTS\f[] can be set with |
| default flags: |
| .IP |
| .nf |
| \f[C] |
| export\ SHELLCHECK_OPTS=\[aq]\-\-shell=bash\ \-\-exclude=SC2016\[aq] |
| \f[] |
| .fi |
| .PP |
| Its value will be split on spaces and prepended to the command line on |
| each invocation. |
| .SH RETURN VALUES |
| .PP |
| ShellCheck uses the follow exit codes: |
| .IP \[bu] 2 |
| 0: All files successfully scanned with no issues. |
| .IP \[bu] 2 |
| 1: All files successfully scanned with some issues. |
| .IP \[bu] 2 |
| 2: Some files could not be processed (e.g. |
| file not found). |
| .IP \[bu] 2 |
| 3: ShellCheck was invoked with bad syntax (e.g. |
| unknown flag). |
| .IP \[bu] 2 |
| 4: ShellCheck was invoked with bad options (e.g. |
| unknown formatter). |
| .SH LOCALE |
| .PP |
| This version of ShellCheck is only available in English. |
| All files are leniently decoded as UTF\-8, with a fallback of |
| ISO\-8859\-1 for invalid sequences. |
| \f[C]LC_CTYPE\f[] is respected for output, and defaults to UTF\-8 for |
| locales where encoding is unspecified (such as the \f[C]C\f[] locale). |
| .PP |
| Windows users seeing |
| \f[C]commitBuffer:\ invalid\ argument\ (invalid\ character)\f[] should |
| set their terminal to use UTF\-8 with \f[C]chcp\ 65001\f[]. |
| .SH AUTHORS |
| .PP |
| ShellCheck is developed and maintained by Vidar Holen, with assistance |
| from a long list of wonderful contributors. |
| .SH REPORTING BUGS |
| .PP |
| Bugs and issues can be reported on GitHub: |
| .PP |
| https://github.com/koalaman/shellcheck/issues |
| .SH COPYRIGHT |
| .PP |
| Copyright 2012\-2019, Vidar Holen and contributors. |
| Licensed under the GNU General Public License version 3 or later, see |
| https://gnu.org/licenses/gpl.html |
| .SH SEE ALSO |
| .PP |
| sh(1) bash(1) |