Vlastimil Burián
Vlastimil Burián

Reputation: 3466

How to suppress irrelevant ShellCheck messages?

Environment

System: Linux Mint 19 (based on Ubuntu 18.04).

Editor: I use Visual Studio Code (official website) with ShellCheck plugin to check for errors, warnings, and hints on-the-fly.


ShellCheck

is a necessary tool for every shell script writer.

Although the developers must have put enormous effort to make it as good as it gets, it sometimes produces irrelevant warnings and / or information.

Example code, with such messages (warning SC2120 + directly adjacent information SC2119):


Example shell script snippet

am_i_root ()
# expected arguments: none
{
    # check if no argument has been passed
    [ "$#" -eq 0 ] || print_error_and_exit "am_i_root" "Some arguments have been passed to the function! No arguments expected. Passed: $*"

    # check if the user is root
    # this will return an exit code of the command itself directly
    [ "$(id -u)" -eq 0 ]
}

# check if the user had by any chance run the script with root privileges and if so, quit
am_i_root && print_error_and_exit "am_i_root" "This script should not be run as root! Quitting to shell."

Where:


Question

How do I disable these messages (locally only)?

Upvotes: 24

Views: 27068

Answers (3)

Pik Master
Pik Master

Reputation: 143

This will be loosely related to your question, but I wanted to share my finding for other people who might have the same question.

If are using shellcheck in VIM, via using ale linter, here is what I had to do to suppress some checks:

" Use ALE plugin to enable shellcheck linter: apt-install vim-ale shellcheck
packadd ale

" Remove the [SC2155=declare and initialize separately]
let g:ale_sh_shellcheck_exclusions='SC2155'

Upvotes: 0

Vlastimil Burián
Vlastimil Burián

Reputation: 3466

Think it through before doing this!

Do this only if you are 100.0% positive that the message(s) is really irrelevant. Then, read the Wiki here and here on this topic.


Once you assured yourself the message(s) is irrelevant

While generally speaking, there are more ways to achieve this goal, I said to disable those messages locally, so there is only one in reality.

That being adding the following line before the actual message occurrence:

# shellcheck disable=code

Notably, adding text after that in the same line will result in an error as it too will be interpreted by shellcheck. If you want to add an explanation as to why you are suppressing the warning, you can add another hash # to prevent shellcheck from interpreting the rest of the line.

Incorrect:

# shellcheck disable=code irrelevant because reasons

Correct:

# shellcheck disable=code # code is irrelevant because reasons

Note, that it is possible to add multiple codes separated by comma like this example:

# shellcheck disable=SC2119,SC2120

Note, that the # in front is an integral part of disabling directive!

Upvotes: 44

enharmonic
enharmonic

Reputation: 2090

With Shellcheck 0.7.1 and later, you can suppress irrelevant messages on the command line by filtering on severity (valid options are: error, warning, info, style):

$ shellcheck --severity=error my_script.sh

This will only show errors and will suppress the annoying SC2034, SC2086, etc. warnings and style recommendations.

You can also suppress messages per-code with a directive in your ~/.shellcheckrc file, such as:

disable=SC2076,SC2016

Both of these options allow you to filter messages globally, rather than having to edit each source code file with the same directives.

If your distro does not have the latest version, you can upgrade with something like:

scversion="stable" # or "0.7.1" or "latest"
wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv
sudo cp "shellcheck-${scversion}/shellcheck" /usr/bin/
shellcheck --version

Upvotes: 7

Related Questions