diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..6b8710a
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+.git
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..fed584a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.yml]
+indent_size = 2
diff --git a/.gitignore b/.gitignore
index 198748e..722d5e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-/local/
+.vscode
diff --git a/.travis.yml b/.travis.yml
index 5601904..dd3ba58 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,33 +1,10 @@
 language: bash
 
-os:
-  - linux
-  - osx
-
-# Prepare the environment
-addons:
-  apt:
-    packages:
-      # Linux: only bash (and sh) are installed by default
-      - ksh
-      - zsh
-      # Linux: install the checkbashisms script
-      - devscripts
-before_install:
-  # OS X: install the checkbashisms script (||true to avoid Linux fail)
-  - test "$TRAVIS_OS_NAME" = osx && brew update                || true
-  - test "$TRAVIS_OS_NAME" = osx && brew install checkbashisms || true
-  - test "$TRAVIS_OS_NAME" = osx && brew install dash          || true
-
 script:
-  # Run some code checkings on the script itself
-  - checkbashisms --posix clitest
-  # Run the full test suite in all the supported POSIX shells
-  - bash clitest test.md
-  - dash clitest test.md
-  - ksh  clitest test.md
-  - zsh  clitest test.md
-  - sh   clitest test.md
+  - make docker-build
+  - make versions
+  - make lint
+  - make test
 
 notifications:
   email: false
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..4b56aeb
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+FROM alpine:3.11
+
+# Perl is required by clitest's --regex matching mode
+RUN apk --no-cache add \
+    bash dash mksh zsh \
+    perl \
+    make \
+    checkbashisms shellcheck
+
+COPY clitest test.md /clitest/
+COPY test/ /clitest/test/
+RUN ln -s /clitest/clitest /usr/local/bin/clitest
+
+WORKDIR /clitest
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..dbbe46a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,33 @@
+# Developer workflow: run locally the same commands Travis will run in
+# the CI. See the .travis.yml file for the list of commands.
+#
+# By default, the linting and testing targets are run inside the clitest
+# Docker container. To run them directly on the host, avoiding the
+# container, unset the `docker_run` variable. Examples:
+#
+#    make test-bash                # test using container's bash
+#    make test-bash docker_run=    # test using host's bash
+
+docker_image = aureliojargas/clitest
+docker_run = docker run --rm -it -v $$PWD:/clitest $(docker_image)
+test_cmd = clitest --first --progress none test.md
+
+default:
+	@echo "Read the comments in the Makefile for help"
+
+lint:
+	$(docker_run) checkbashisms --posix clitest
+	$(docker_run) shellcheck clitest
+
+test: test-bash test-dash test-mksh test-sh test-zsh
+test-%:
+	$(docker_run) $* $(test_cmd)
+
+versions:
+	@$(docker_run) sh -c 'apk list 2>/dev/null | cut -d " " -f 1 | sort'
+
+docker-build:
+	docker build -t $(docker_image) .
+
+docker-run:
+	$(docker_run) $(cmd)
diff --git a/README-docker.md b/README-docker.md
new file mode 100644
index 0000000..65bdbe3
--- /dev/null
+++ b/README-docker.md
@@ -0,0 +1,118 @@
+# clitest Docker image
+
+This is a [clitest](https://github.com/aureliojargas/clitest) Docker image based on the lightweight [Alpine Linux image](https://hub.docker.com/_/alpine/).
+
+## Get it
+
+```
+docker pull aureliojargas/clitest
+```
+
+## Initial run
+
+For the available clitest options, just run the image with the command `clitest --help`:
+
+```console
+$ docker run --rm aureliojargas/clitest clitest --help
+Usage: clitest [options] <file ...>
+
+Options:
+  -1, --first                 Stop execution upon first failed test
+  -l, --list                  List all the tests (no execution)
+  -L, --list-run              List all the tests with OK/FAIL status
+  -t, --test RANGE            Run specific tests, by number (1,2,4-7)
+  -s, --skip RANGE            Skip specific tests, by number (1,2,4-7)
+      --pre-flight COMMAND    Execute command before running the first test
+      --post-flight COMMAND   Execute command after running the last test
+  -q, --quiet                 Quiet operation, no output shown
+  -V, --version               Show program version and exit
+
+Customization options:
+  -P, --progress TYPE         Set progress indicator: test, number, dot, none
+      --color WHEN            Set when to use colors: auto, always, never
+      --diff-options OPTIONS  Set diff command options (default: '-u')
+      --inline-prefix PREFIX  Set inline output prefix (default: '#=> ')
+      --prefix PREFIX         Set command line prefix (default: '')
+      --prompt STRING         Set prompt string (default: '$ ')
+$
+```
+
+## Test your own files
+
+To run clitest on your own test files, map their directory with `-v`. For example, mapping the current directory to container's `/src` and testing the `test.md` file:
+
+```
+docker run --rm -t -v "$PWD:/src/" aureliojargas/clitest clitest /src/test.md
+```
+
+Same as before, but this time using `-w` to set the current directory to `/src`, making sure the execution happens inside your directory:
+
+```
+docker run --rm -t -v "$PWD:/src/" -w /src aureliojargas/clitest clitest test.md
+```
+
+If you don't have any test files right now, you can see clitest in action by running its own test suite:
+
+```console
+$ docker run --rm -t -w /clitest aureliojargas/clitest clitest test.md
+#1    test -f ./clitest; echo $?
+#2    test -d ./test/; echo $?
+#3    COLUMNS=80
+#4    export COLUMNS
+#5    echo $COLUMNS
+...
+#260  ./clitest test/blank-output.sh
+#261  ./clitest test/no-nl-file-1.sh
+#262  ./clitest test/no-nl-file-2.sh
+#263  ./clitest test/no-nl-file-3.sh
+#264  ./clitest test/no-nl-command.sh
+#265  ./clitest --color yes --first test/fail-2.sh
+OK: 265 of 265 tests passed
+$
+```
+
+Make sure to use `-t` in `docker run` to get colors in clitest output.
+
+## Build
+
+To build this image, go to clitest repository root and run:
+
+```
+make docker-build
+```
+
+
+## About clitest
+
+[Clitest](https://github.com/aureliojargas/clitest) is a portable POSIX shell script that performs automatic testing in Unix command lines.
+
+It's the same concept as in [Python's doctest module](http://en.wikipedia.org/wiki/Doctest). You save the commands and their expected output in a text file:
+
+```
+$ echo "Hello World"
+Hello World
+$ cd /tmp
+$ pwd
+/tmp
+$ cd "$OLDPWD"
+$
+```
+
+and then use clitest to run those commands and compare their output:
+
+```console
+$ clitest examples/intro.txt
+#1      echo "Hello World"
+#2      cd /tmp
+#3      pwd
+#4      cd "$OLDPWD"
+OK: 4 of 4 tests passed
+$
+```
+
+That's it!
+
+- **There's no syntax to learn**, just copy/paste the command line history into a text file.
+- Useful for automated testing and testable documentation (Markdown file with commands).
+
+See examples and instructions in the [GitHub repository](https://github.com/aureliojargas/clitest).
diff --git a/README.md b/README.md
index 7c7b0a0..8a945eb 100644
--- a/README.md
+++ b/README.md
@@ -380,16 +380,18 @@ clitest  --prefix 4 --prompt '[john@localhost ~]$ ' README.md
 ## Nerdiness
 
 * Use any text file format for the tests, it doesn't matter. The command
-  lines just need to be grepable and have a fixed prefix (or none).
+  lines just need to be grepable and have a fixed prefix (or even none).
   Even Windows text files (CR+LF) will work fine.
 
-* The cmdline power is available in your test files: use variables,
+* The command line power is available in your test files: use variables,
   pipes, redirection, create files, folders, move around…
 
-* All the commands are tested in the same shell. Defined variables,
-  aliases and functions will persist between tests.
+* All the commands are tested using a single shell session. This means
+  that variables, aliases and functions defined in one test will persist
+  in the following tests.
 
-* Both STDIN and STDOUT are catch, you can also test error messages.
+* Both STDOUT and STDERR are captured, so you can also test error
+  messages.
 
 * To test STDOUT/STDERR and the exit code at the same time, add a
   `;echo $?` after the command.
@@ -434,7 +436,7 @@ ksh clitest tests.txt        # Uses Korn Shell
 ## Portability
 
 This script was carefully coded to be portable between [POSIX][13]
-shells.
+shells. It's validated by [checkbashisms][25] and [shellcheck][26].
 
 It was tested in:
 
@@ -493,3 +495,5 @@ No other language or environment involved.
 [22]: https://github.com/aureliojargas/clitest/blob/master/LICENSE.txt
 [23]: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
 [24]: https://github.com/funcoeszz/funcoeszz/tree/master/testador
+[25]: https://linux.die.net/man/1/checkbashisms
+[26]: https://www.shellcheck.net/
diff --git a/clitest b/clitest
index c0af152..29c842f 100755
--- a/clitest
+++ b/clitest
@@ -7,9 +7,8 @@
 # GitHub:  https://github.com/aureliojargas/clitest
 #
 # POSIX shell script:
-#   This script was coded to be compatible with POSIX shells.
-#   Tested in Bash 3.2, dash 0.5.5.1, ksh 93u 2011-02-08.
-#   Note: Can't set -o posix nor POSIXLY_CORRECT: test env must be intact.
+#   This script is carefully coded to be compatible with POSIX shells.
+#   It is currently tested in bash, dash, ksh, zsh and busybox's sh.
 #
 # Exit codes:
 #   0  All tests passed, or normal operation (--help, --list, ...)
@@ -19,8 +18,8 @@
 # Test environment:
 #   By default, the tests will run in the current working directory ($PWD).
 #   You can change to another dir normally using 'cd' inside the test file.
-#   All the tests are executed in the same shell, using eval. Test data
-#   such as variables and working directory will persist between tests.
+#   All the tests are executed in the same shell session, using eval. Test
+#   data such as variables and working directory will persist between tests.
 #
 # Namespace:
 #   All variables and functions in this script are prefixed by 'tt_' to
@@ -230,13 +229,16 @@ tt_parse_range ()  # $1=range
                 tt_n2=${tt_part#*-}
 
                 tt_operation='+'
-                test $tt_n1 -gt $tt_n2 && tt_operation='-'
+                test "$tt_n1" -gt "$tt_n2" && tt_operation='-'
 
                 # Expand the range (1-4 => 1:2:3:4)
                 tt_part=$tt_n1:
-                while test $tt_n1 -ne $tt_n2
+                while test "$tt_n1" -ne "$tt_n2"
                 do
-                    tt_n1=$(($tt_n1 $tt_operation 1))
+                    # Math operator in a variable drives shellcheck crazy
+                    # https://github.com/koalaman/shellcheck/issues/2000
+                    # shellcheck disable=SC1102
+                    tt_n1=$((tt_n1 $tt_operation 1))
                     tt_part=$tt_part$tt_n1:
                 done
                 tt_part=${tt_part%:}
@@ -244,10 +246,10 @@ tt_parse_range ()  # $1=range
         esac
 
         # Append the number or expanded range to the holder
-        test $tt_part != 0 && tt_range_data=$tt_range_data$tt_part:
+        test "$tt_part" != 0 && tt_range_data=$tt_range_data$tt_part:
     done
 
-    test $tt_range_data != ':' && echo $tt_range_data
+    test "$tt_range_data" != ':' && echo "$tt_range_data"
     return 0
 }
 tt_reset_test_data ()
@@ -262,15 +264,15 @@ tt_reset_test_data ()
 }
 tt_run_test ()
 {
-    tt_test_number=$(($tt_test_number + 1))
-    tt_nr_total_tests=$(($tt_nr_total_tests + 1))
-    tt_nr_file_tests=$(($tt_nr_file_tests + 1))
+    tt_test_number=$((tt_test_number + 1))
+    tt_nr_total_tests=$((tt_nr_total_tests + 1))
+    tt_nr_file_tests=$((tt_nr_file_tests + 1))
 
     # Run range on: skip this test if it's not listed in $tt_run_range_data
     if test -n "$tt_run_range_data" && test "$tt_run_range_data" = "${tt_run_range_data#*:$tt_test_number:}"
     then
-        tt_nr_total_skips=$(($tt_nr_total_skips + 1))
-        tt_nr_file_skips=$(($tt_nr_file_skips + 1))
+        tt_nr_total_skips=$((tt_nr_total_skips + 1))
+        tt_nr_file_skips=$((tt_nr_file_skips + 1))
         tt_reset_test_data
         return 0
     fi
@@ -279,8 +281,8 @@ tt_run_test ()
     # Note: --skip always wins over --test, regardless of order
     if test -n "$tt_skip_range_data" && test "$tt_skip_range_data" != "${tt_skip_range_data#*:$tt_test_number:}"
     then
-        tt_nr_total_skips=$(($tt_nr_total_skips + 1))
-        tt_nr_file_skips=$(($tt_nr_file_skips + 1))
+        tt_nr_total_skips=$((tt_nr_total_skips + 1))
+        tt_nr_file_skips=$((tt_nr_file_skips + 1))
         tt_reset_test_data
         return 0
     fi
@@ -346,7 +348,7 @@ tt_run_test ()
         ;;
         file)
             # If path is relative, make it relative to the test file path, not $PWD
-            if test $tt_test_inline = ${tt_test_inline#/}
+            if test "$tt_test_inline" = "${tt_test_inline#/}"
             then
                 tt_test_inline="$(dirname "$tt_test_file")/$tt_test_inline"
             fi
@@ -360,7 +362,7 @@ tt_run_test ()
             tt_test_status=$?
         ;;
         egrep)
-            egrep "$tt_test_inline" "$tt_test_output_file" > /dev/null
+            grep -E "$tt_test_inline" "$tt_test_output_file" > /dev/null
             tt_test_status=$?
 
             # Test failed: the regex not matched
@@ -416,8 +418,8 @@ tt_run_test ()
     # Test failed :(
     if test $tt_test_status -ne 0
     then
-        tt_nr_file_fails=$(($tt_nr_file_fails + 1))
-        tt_nr_total_fails=$(($tt_nr_total_fails + 1))
+        tt_nr_file_fails=$((tt_nr_file_fails + 1))
+        tt_nr_total_fails=$((tt_nr_total_fails + 1))
         tt_failed_range="$tt_failed_range$tt_test_number,"
 
         # Decide the message format
@@ -465,7 +467,7 @@ tt_process_test_file ()
     # Note: read -r to preserve the backslashes
     while IFS='' read -r tt_input_line || test -n "$tt_input_line"
     do
-        tt_line_number=$(($tt_line_number + 1))
+        tt_line_number=$((tt_line_number + 1))
         #tt_debug INPUT_LINE "$tt_input_line"
 
         case "$tt_input_line" in
@@ -607,8 +609,10 @@ tt_make_temp_dir ()
     tt_temp_dir=$(mktemp -d "${TMPDIR:-/tmp}/clitest.XXXXXX" 2> /dev/null) && return 0
 
     # No mktemp, let's create the dir manually
+    # shellcheck disable=SC2015
     tt_temp_dir="${TMPDIR:-/tmp}/clitest.$(awk 'BEGIN { srand(); print rand() }').$$" &&
-        mkdir -m 700 "$tt_temp_dir" || tt_error "cannot create temporary dir: $tt_temp_dir"
+        mkdir -m 700 "$tt_temp_dir" ||
+        tt_error "cannot create temporary dir: $tt_temp_dir"
 }
 
 
@@ -618,6 +622,7 @@ tt_make_temp_dir ()
 tt_temp_dir=
 tt_make_temp_dir  # sets global $tt_temp_dir
 tt_temp_file="$tt_temp_dir/temp.txt"
+tt_stdin_file="$tt_temp_dir/stdin.txt"
 tt_test_ok_file="$tt_temp_dir/ok.txt"
 tt_test_output_file="$tt_temp_dir/output.txt"
 
@@ -645,7 +650,7 @@ do
             exit 0
         ;;
         -V|--version)
-            printf '%s %s\n%s\n' $tt_my_name $tt_my_version $tt_my_version_url
+            printf '%s %s\n%s\n' "$tt_my_name" "$tt_my_version" "$tt_my_version_url"
             exit 0
         ;;
         --)
@@ -654,7 +659,7 @@ do
             break
         ;;
         -)
-            # Argument - means "read from STDIN" (not supported)
+            # Argument - means "read test file from STDIN"
             break
         ;;
         *)
@@ -754,7 +759,7 @@ fi
 # In other shells, try to use 'tput cols' (not POSIX).
 # If not, defaults to 50 columns, a conservative amount.
 : ${COLUMNS:=$(tput cols 2> /dev/null)}
-: ${COLUMNS:=50}
+: "${COLUMNS:=50}"
 
 # Parse and validate --test option value, if informed
 tt_run_range_data=$(tt_parse_range "$tt_run_range")
@@ -785,10 +790,24 @@ for tt_test_file
 do
     # Some tests may 'cd' to another dir, we need to get back
     # to preserve the relative paths of the input files
-    cd "$tt_original_dir"
+    cd "$tt_original_dir" ||
+        tt_error "cannot enter starting directory $tt_original_dir"
+
+    # Support using '-' to read the test file from STDIN
+    if test "$tt_test_file" = '-'
+    then
+        tt_test_file="$tt_stdin_file"
+        cat > "$tt_test_file"
+    fi
+
+    # Abort when test file is a directory
+    if test -d "$tt_test_file"
+    then
+        tt_error "input file is a directory: $tt_test_file"
+    fi
 
     # Abort when test file not found/readable
-    if test ! -f "$tt_test_file" || test ! -r "$tt_test_file"
+    if test ! -r "$tt_test_file"
     then
         tt_error "cannot read input file: $tt_test_file"
     fi
@@ -831,7 +850,7 @@ do
     fi
 
     # Save file stats
-    tt_nr_file_ok=$(($tt_nr_file_tests - $tt_nr_file_fails - $tt_nr_file_skips))
+    tt_nr_file_ok=$((tt_nr_file_tests - tt_nr_file_fails - tt_nr_file_skips))
     tt_files_stats="$tt_files_stats$tt_nr_file_ok $tt_nr_file_fails $tt_nr_file_skips$tt_nl"
 
     # Dots mode: any missing new line?
@@ -889,9 +908,9 @@ if test $tt_nr_files -gt 1 && test "$tt_output_mode" != 'quiet'
 then
     echo
     printf '  %5s %5s %5s\n' ok fail skip
-    printf %s "$tt_files_stats" | while read ok fail skip
+    printf %s "$tt_files_stats" | while read -r ok fail skip
     do
-        printf '  %5s %5s %5s    %s\n' $ok $fail $skip "$1"
+        printf '  %5s %5s %5s    %s\n' "$ok" "$fail" "$skip" "$1"
         shift
     done | sed 's/     0/     -/g'  # hide zeros
     echo
@@ -910,7 +929,7 @@ fi
 if test $tt_nr_total_fails -eq 0
 then
     stamp="${tt_color_green}OK:${tt_color_off}"
-    stats="$(($tt_nr_total_tests - $tt_nr_total_skips)) of $tt_nr_total_tests tests passed"
+    stats="$((tt_nr_total_tests - tt_nr_total_skips)) of $tt_nr_total_tests tests passed"
     test $tt_nr_total_tests -eq 1 && stats=$(echo "$stats" | sed 's/tests /test /')
     tt_message "$stamp $stats$skips"
     exit 0
diff --git a/debian/changelog b/debian/changelog
index bf25956..14b1d1f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+clitest (0.3.0+git20200626.88df6a2-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 26 Jun 2020 22:25:36 +0000
+
 clitest (0.3.0-3) unstable; urgency=medium
 
   * Bump debhelper from old 10 to 12.
diff --git a/examples/install-software.md b/examples/install-software.md
index 92ee03e..9d2688b 100644
--- a/examples/install-software.md
+++ b/examples/install-software.md
@@ -17,7 +17,7 @@ and test the txt2tags package before installing it to the system.
 
 Download the .tgz file for the version 2.6, directly from Google Code.
 
-	$ url="http://txt2tags.googlecode.com/files/txt2tags-2.6.tgz"
+	$ url="https://fossies.org/linux/privat/txt2tags-2.6.tgz"
 	$ curl -O -s -S "$url"
 
 
diff --git a/examples/install-software.txt b/examples/install-software.txt
index ccd965c..d2e8814 100644
--- a/examples/install-software.txt
+++ b/examples/install-software.txt
@@ -1,5 +1,5 @@
 $ cd /tmp
-$ url="http://txt2tags.googlecode.com/files/txt2tags-2.6.tgz"
+$ url="https://fossies.org/linux/privat/txt2tags-2.6.tgz"
 $ curl -O -s -S "$url"                     # download
 $ du -h txt2tags-2.6.tgz                   # verify size
 532K	txt2tags-2.6.tgz
diff --git a/test.md b/test.md
index 1ff9cdf..b694b75 100644
--- a/test.md
+++ b/test.md
@@ -22,6 +22,8 @@ $
 Set a default terminal width of 80 columns. It's used by separator lines.
 
 ```
+$ shopt -u checkwinsize 2> /dev/null  # bash: disable automatic check
+$ unset COLUMNS  # mksh: first unset, then one can manually set it
 $ COLUMNS=80
 $ export COLUMNS
 $
@@ -45,10 +47,10 @@ $ echo $not_exported  #=> --regex ^1$
 
 ```
 $ TMPDIR___SAVE="$TMPDIR"
-$ TMPDIR=/XXnotfoundXX
+$ TMPDIR=/notfound
 $ export TMPDIR
 $ ./clitest test/ok-1.sh 2>&1 | grep ^clitest | sed 's/clitest\..*$/clitest.XXXXXX/'
-clitest: Error: cannot create temporary dir: /XXnotfoundXX/clitest.XXXXXX
+clitest: Error: cannot create temporary dir: /notfound/clitest.XXXXXX
 $ TMPDIR="$TMPDIR___SAVE"
 $
 ```
@@ -71,15 +73,21 @@ $
 File not found
 
 ```
-$ ./clitest XXnotfoundXX.sh; echo $?
-clitest: Error: cannot read input file: XXnotfoundXX.sh
+$ ./clitest notfound; echo $?
+clitest: Error: cannot read input file: notfound
 2
+$
+```
+
+File is a directory
+
+```
 $ ./clitest .
-clitest: Error: cannot read input file: .
+clitest: Error: input file is a directory: .
 $ ./clitest ./
-clitest: Error: cannot read input file: ./
+clitest: Error: input file is a directory: ./
 $ ./clitest /etc
-clitest: Error: cannot read input file: /etc
+clitest: Error: input file is a directory: /etc
 $
 ```
 
@@ -181,8 +189,8 @@ $
 ## Option --quiet has no effect in error messages
 
 ```
-$ ./clitest --quiet /etc
-clitest: Error: cannot read input file: /etc
+$ ./clitest --quiet notfound
+clitest: Error: cannot read input file: notfound
 $
 ```
 
@@ -1332,7 +1340,7 @@ clitest: Error: empty --file at line 1 of test/inline-match-file-error-1.sh
 2
 $ ./clitest test/inline-match-file-error-2.sh; echo $?
 #1	echo "error: file not found"  
-clitest: Error: cannot read inline output file 'test/XXnotfoundXX', from line 1 of test/inline-match-file-error-2.sh
+clitest: Error: cannot read inline output file 'test/notfound', from line 1 of test/inline-match-file-error-2.sh
 2
 $ ./clitest test/inline-match-file-error-3.sh; echo $?
 #1	echo "error: directory"  
@@ -2102,23 +2110,36 @@ clitest: Error: cannot read input file: --quiet
 $
 ```
 
-## File - meaning STDIN (not supported)
+## File - meaning STDIN
 
 ```
 $ cat test/ok-1.sh | ./clitest -
-clitest: Error: cannot read input file: -
+#1	echo ok
+OK: 1 of 1 test passed
 $ cat test/ok-1.sh | ./clitest -- -; echo $?
-clitest: Error: cannot read input file: -
-2
+#1	echo ok
+OK: 1 of 1 test passed
+0
 $
 ```
 
-## Read test file from STDIN (not supported)
+## Read test file from /dev/stdin
 
 ```
-$ cat test/ok-1.sh | ./clitest /dev/stdin; echo $?
-clitest: Error: cannot read input file: /dev/stdin
-2
+$ cat test/ok-1.sh | ./clitest /dev/stdin
+#1	echo ok
+OK: 1 of 1 test passed
+$
+```
+
+## Test file is a symlink
+
+```
+$ ln -s test/ok-1.sh testsymlink
+$ ./clitest testsymlink
+#1	echo ok
+OK: 1 of 1 test passed
+$ rm testsymlink
 $
 ```
 
@@ -2127,8 +2148,8 @@ $
 Test exit code and STDOUT/STDERR at the same time
 
 ```
-$ ./clitest foo; echo $?
-clitest: Error: cannot read input file: foo
+$ ./clitest notfound; echo $?
+clitest: Error: cannot read input file: notfound
 2
 $ ./clitest test/exit-code-and-stdout.sh 
 #1	echo "zero"; echo $?
@@ -2146,11 +2167,11 @@ $ ./clitest test/stdout-stderr.sh
 #3	echo "stderr" 1>&2
 #4	echo "stdout" > /dev/null
 #5	echo "stdout" 2> /dev/null 1>&2
-#6	./clitest foo
-#7	./clitest foo > /dev/null
-#8	./clitest foo 2>&1
-#9	./clitest foo 2> /dev/null
-#10	./clitest foo > /dev/null 2>&1
+#6	./clitest notfound
+#7	./clitest notfound > /dev/null
+#8	./clitest notfound 2>&1
+#9	./clitest notfound 2> /dev/null
+#10	./clitest notfound > /dev/null 2>&1
 OK: 10 of 10 tests passed
 $
 ```
diff --git a/test/inline-match-file-error-2.sh b/test/inline-match-file-error-2.sh
index c5f794c..48218c8 100644
--- a/test/inline-match-file-error-2.sh
+++ b/test/inline-match-file-error-2.sh
@@ -1 +1 @@
-$ echo "error: file not found"  #=> --file XXnotfoundXX
+$ echo "error: file not found"  #=> --file notfound
diff --git a/test/stdout-stderr.sh b/test/stdout-stderr.sh
index da8da74..487f982 100644
--- a/test/stdout-stderr.sh
+++ b/test/stdout-stderr.sh
@@ -26,20 +26,20 @@ $
 
 # Showing STDERR
 
-$ ./clitest foo
-clitest: Error: cannot read input file: foo
-$ ./clitest foo > /dev/null
-clitest: Error: cannot read input file: foo
+$ ./clitest notfound
+clitest: Error: cannot read input file: notfound
+$ ./clitest notfound > /dev/null
+clitest: Error: cannot read input file: notfound
 $
 
 # Redirecting STDERR to STDOUT
 
-$ ./clitest foo 2>&1
-clitest: Error: cannot read input file: foo
+$ ./clitest notfound 2>&1
+clitest: Error: cannot read input file: notfound
 $
 
 # Closing STDERR
 
-$ ./clitest foo 2> /dev/null
-$ ./clitest foo > /dev/null 2>&1
+$ ./clitest notfound 2> /dev/null
+$ ./clitest notfound > /dev/null 2>&1
 $