From 52ab7dee2df2073f4790c538a3fffe2cb991f790 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Fri, 27 Nov 2015 17:32:48 -0800 Subject: [PATCH] Updating README.md to take over for shellcheck.net/about.html --- README.md | 269 ++++++++++++++++++++++++++++++++++------- doc/emacs-flycheck.png | Bin 0 -> 22486 bytes doc/terminal.png | Bin 0 -> 4582 bytes doc/vim-syntastic.png | Bin 0 -> 2671 bytes 4 files changed, 226 insertions(+), 43 deletions(-) create mode 100644 doc/emacs-flycheck.png create mode 100644 doc/terminal.png create mode 100644 doc/vim-syntastic.png diff --git a/README.md b/README.md index e7d4d37..b79b8d6 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,66 @@ # ShellCheck - A shell script static analysis tool -http://www.shellcheck.net +ShellCheck is a GPLv3 tool that gives warnings and suggestions for bash/sh shell scripts: -Copyright 2012-2015, Vidar 'koala_man' Holen -Licensed under the GNU General Public License, v3 +![Screenshot of a terminal showing problematic shell script lines highlighted](doc/terminal.png). -The goals of ShellCheck are: +The goals of ShellCheck are - - To point out and clarify typical beginner's syntax issues, + - To point out and clarify typical beginner's syntax issues that causes a shell to give cryptic error messages. - - To point out and clarify typical intermediate level semantic problems, + - To point out and clarify typical intermediate level semantic problems that causes a shell to behave strangely and counter-intuitively. - - To point out subtle caveats, corner cases and pitfalls, that may cause an + - To point out subtle caveats, corner cases and pitfalls that may cause an advanced user's otherwise working script to fail under future circumstances. + +See [the gallery of bad code](README.md#user-content-gallery-of-bad-code) for examples of what ShellCheck can help you identify! + + +## How to use +There are a variety of ways to use ShellCheck! + + +#### On the web +Paste a shell script on http://www.shellcheck.net for instant feedback. + +[ShellCheck.net](http://www.shellcheck.net) is always synchronized to the latest git commit, and is the simplest way to give ShellCheck a go. Tell your friends! + + +#### From your terminal +Run `shellcheck yourscript` in your terminal for instant output, as seen above. + + +#### In your editor + +You can see ShellCheck suggestions directly in a variety of editors. + +* Vim, through [Syntastic](https://github.com/scrooloose/syntastic): + +![Screenshot of vim showing inlined shellcheck feedback](doc/vim-syntastic.png). + +* Emacs, through [Flycheck](https://github.com/flycheck/flycheck): + +![Screenshot of emacs showing inlined shellcheck feedback](doc/emacs-flycheck.png). + +* Sublime, through [SublimeLinter](https://github.com/SublimeLinter/SublimeLinter-shellcheck). + +* Atom, through [Linter](https://github.com/AtomLinter/linter-shellcheck). + +* Most other editors, through [GCC error compatibility](blob/master/shellcheck.1.md#user-content-formats). + + +#### In your build or test suites +While ShellCheck is mostly intended for interactive use, it can easily be added to builds or test suites. + +Use ShellCheck's exit code, or it's [CheckStyle compatible XML output](blob/master/shellcheck.1.md#user-content-formats). There's also a simple JSON output format for easy integration. -ShellCheck is written in Haskell, and requires 2 GB of memory to compile. ## Installing +The easiest way to install ShellCheck locally is through your package manager. + On systems with Cabal: cabal update @@ -37,6 +78,10 @@ On OS X with homebrew: brew install shellcheck +On OS X with MacPorts: + + port install shellcheck + On openSUSE:Tumbleweed: zypper in ShellCheck @@ -50,54 +95,35 @@ add OBS devel:languages:haskell repository from https://build.opensuse.org/proje or use OneClickInstall - https://software.opensuse.org/package/ShellCheck -ShellCheck is also available as an online service: - http://www.shellcheck.net +## Compiling from source -## Building with Cabal +This sections describes how to build ShellCheck from a source directory. ShellCheck is written in Haskell and requires 2GB of RAM to compile. -This sections describes how to build ShellCheck from a source directory. -First, make sure cabal is installed. On Debian based distros: +#### Installing Cabal - apt-get install cabal-install +ShellCheck is built and packaged using Cabal. Install the package `cabal-install` from your system's package manager (with e.g. `apt-get`, `yum`, `zypper` or `brew`). -On Fedora: +On MacPorts, the package is instead called `hs-cabal-install`, while native Windows users should install the latest version of the Haskell platform from https://www.haskell.org/platform/ - yum install cabal-install - -On openSUSE:Tumbleweed: - - zypper in cabal-install - -On Mac OS X with homebrew (http://brew.sh/): - - brew install cabal-install - -On Mac OS X with MacPorts (http://www.macports.org/): - - port install hs-cabal-install - -On native Windows (https://www.haskell.org/platform/): - - Download and install the latest version of the Haskell Platform. - -Let cabal update itself, in case your distro version is outdated: +Verify that `cabal` is installed and update its dependency list with $ cabal update - $ cabal install cabal-install -With cabal installed, cd to the ShellCheck source directory and: +#### Compiling ShellCheck + +`git clone` this repository, and `cd` to the ShellCheck source directory to build/install: $ cabal install -This will install ShellCheck to your `~/.cabal/bin` directory. +This will compile ShellCheck and install it to your `~/.cabal/bin` directory. -Add the directory to your `PATH` (for bash, add this to your `~/.bashrc`): +Add this directory to your `PATH` (for bash, add this to your `~/.bashrc`): export PATH="$HOME/.cabal/bin:$PATH" -Verify that your PATH is set up correctly: +Log out and in again, and verify that your PATH is set up correctly: $ which shellcheck ~/.cabal/bin/shellcheck @@ -114,13 +140,155 @@ In Powershell ISE, you may need to additionally update the output encoding: > [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 -## Running tests +#### Running tests To run the unit test suite: - cabal configure --enable-tests - cabal build - cabal test + $ cabal test + + +## Gallery of bad code +So what kind of things does ShellCheck look for? Here is an incomplete list of detected issues. + +#### Quoting + +ShellCheck can recognize several types of incorrect quoting: + + echo $1 # Unquoted variables + find . -name *.ogg # Unquoted find/grep patterns + rm "~/my file.txt" # Quoted tilde expansion + v='--verbose="true"'; cmd $v # Literal quotes in variables + for f in "*.ogg" # Incorrectly quoted 'for' loops + touch $@ # Unquoted $@ + echo 'Don't forget to restart!' # Singlequote closed by apostrophe + echo 'Don\'t try this at home' # Attempting to escape ' in '' + echo 'Path is $PATH' # Variables in single quotes + trap "echo Took ${SECONDS}s" 0 # Prematurely expanded trap + + +#### Conditionals + +ShellCheck can recognize many types of incorrect test statements. + + [[ n != 0 ]] # Constant test expressions + [[ -e *.mpg ]] # Existence checks of globs + [[ $foo==0 ]] # Always true due to missing spaces + [[ -n "$foo " ]] # Always true due to literals + [[ $foo =~ "fo+" ]] # Quoted regex in =~ + [ foo =~ re ] # Unsupported [ ] operators + [ $1 -eq "shellcheck" ] # Numerical comparison of strings + [ $n && $m ] # && in [ .. ] + [ grep -q foo file ] # Command without $(..) + + +#### Frequently misused commands + +ShellCheck can recognize instances where commands are used incorrectly: + + grep '*foo*' file # Globs in regex contexts + find . -exec foo {} && bar {} \; # Prematurely terminated find -exec + sudo echo 'Var=42' > /etc/profile # Redirecting sudo + time --format=%s sleep 10 # Passing time(1) flags to time builtin + while read h; do ssh "$h" uptime # Commands eating while loop input + alias archive='mv $1 /backup' # Defining aliases with arguments + tr -cd '[a-zA-Z0-9]' # [] around ranges in tr + exec foo; echo "Done!" # Misused 'exec' + find -name \*.bak -o -name \*~ -delete # Implicit precedence in find + f() { whoami; }; sudo f # External use of internal functions + + +#### Common beginner's mistakes + +ShellCheck recognizes many common beginner's syntax errors: + + var = 42 # Spaces around = in assignments + $foo=42 # $ in assignments + for $var in *; do ... # $ in for loop variables + var$n="Hello" # Wrong indirect assignment + echo ${var$n} # Wrong indirect reference + var=(1, 2, 3) # Comma separated arrays + echo "Argument 10 is $10" # Positional parameter misreference + if $(myfunction); then ..; fi # Wrapping commands in $() + else if othercondition; then .. # Using 'else if' + + +#### Style + +ShellCheck can make suggestions to improve style: + + [[ -z $(find /tmp | grep mpg) ]] # Use grep -q instead + a >> log; b >> log; c >> log # Use a redirection block instead + echo "The time is `date`" # Use $() instead + cd dir; process *; cd ..; # Use subshells instead + echo $[1+2] # Use standard $((..)) instead of old $[] + echo $(($RANDOM % 6)) # Don't use $ on variables in $((..)) + echo "$(date)" # Useless use of echo + cat file | grep foo # Useless use of cat + + +#### Data and typing errors + +ShellCheck can recognize issues related to data and typing: + + args="$@" # Assigning arrays to strings + files=(foo bar); echo "$files" # Referencing arrays as strings + printf "%s\n" "Arguments: $@." # Concatenating strings and arrays. + [[ $# > 2 ]] # Comparing numbers as strings + var=World; echo "Hello " var # Unused lowercase variables + echo "Hello $name" # Unassigned lowercase variables + cmd | read bar; echo $bar # Assignments in subshells + + +#### Robustness + +ShellCheck can make suggestions for improving the robustness of a script: + + rm -rf "$STEAMROOT/"* # Catastrophic rm + touch ./-l; ls * # Globs that could become options + find . -exec sh -c 'a && b {}' \; # Find -exec shell injection + printf "Hello $name" # Variables in printf format + for f in $(ls *.txt); do # Iterating over ls output + export MYVAR=$(cmd) # Masked exit codes + + +#### Portability + +ShellCheck will warn when using features not supported by the shebang. For example, if you set the shebang to `#!/bin/sh`, ShellCheck will warn about portability issues similar to `checkbashisms`: + + + echo {1..$n} # Works in ksh, but not bash/dash/sh + echo {1..10} # Works in ksh and bash, but not dash/sh + echo -n 42 # Works in ksh, bash and dash, undefined in sh + trap 'exit 42' sigint # Unportable signal spec + cmd &> file # Unportable redirection operator + read foo < /dev/tcp/host/22 # Unportable intercepted files + foo-bar() { ..; } # Undefined/unsupported function name + [ $UID = 0 ] # Variable undefined in dash/sh + local var=value # local is undefined in sh + + +#### Miscellaneous + +ShellCheck recognizes a menagerie of other issues: + + PS1='\e[0;32m\$\e[0m ' # PS1 colors not in \[..\] + PATH="$PATH:~/bin" # Literal tilde in $PATH + rm “file” # Unicode quotes + echo "Hello world" # Carriage return / DOS line endings + var=42 echo $var # Expansion of inlined environment + #!/bin/bash -x -e # Common shebang errors + echo $((n/180*100)) # Unnecessary loss of precision + ls *[:digit:].txt # Bad character class globs + sed 's/foo/bar/ file > file # Redirecting to input + + +## Testimonials + +> At first you're like "shellcheck is awesome" but then you're like "wtf are we still using bash" + +Alexander Tarasikov, +[via Twitter](https://twitter.com/astarasikov/status/568825996532707330) + ## Reporting bugs @@ -128,4 +296,19 @@ Please use the Github issue tracker for any bugs or feature suggestions: https://github.com/koalaman/shellcheck/issues + +## Contributing + +Please submit patches to code or documentation as Github pull requests! + +Contributions must be licensed under the GNU GPLv3. +The contributor retains the copyright. + + +## Copyright + +ShellCheck is licensed under the GNU General Public License, v3. A copy of this license is included in the file [LICENSE](LICENSE). + +Copyright 2012-2015, Vidar 'koala_man' Holen and contributors. + Happy ShellChecking! diff --git a/doc/emacs-flycheck.png b/doc/emacs-flycheck.png new file mode 100644 index 0000000000000000000000000000000000000000..98d9211117dc69dfd424536fb3a1ee03e50600f7 GIT binary patch literal 22486 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 literal 0 HcmV?d00001 diff --git a/doc/terminal.png b/doc/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce2a8d435e62673d0fc148e49349f21366e0d57 GIT binary patch literal 4582 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 NLvryT{B$HZ?N3&-dglND literal 0 HcmV?d00001