diff --git a/test/decode_to_md5.sh b/test/decode_to_md5.sh
index da1a870621331b63cfef417459e52d91f4d8d538..f64acc8b0095f0a1c7df052b85004f6405c17454 100755
--- a/test/decode_to_md5.sh
+++ b/test/decode_to_md5.sh
@@ -24,22 +24,25 @@ decode_to_md5_verify_environment() {
   fi
 }
 
-# Runs decode_to_md5 on $1 and echoes the MD5 sum for the final frame. $2 is
-# interpreted as codec name and used solely to name the output file.
+# Runs decode_to_md5 on $1 and captures the md5 sum for the final frame. $2 is
+# interpreted as codec name and used solely to name the output file. $3 is the
+# expected md5 sum: It must match that of the final frame.
 decode_to_md5() {
   local decoder="${LIBVPX_BIN_PATH}/decode_to_md5${VPX_TEST_EXE_SUFFIX}"
   local input_file="$1"
   local codec="$2"
+  local expected_md5="$3"
   local output_file="${VPX_TEST_OUTPUT_DIR}/decode_to_md5_${codec}"
 
   [ -x "${decoder}" ] || return 1
 
-  "${decoder}" "${input_file}" "${output_file}" > /dev/null 2>&1
+  eval "${decoder}" "${input_file}" "${output_file}" ${devnull}
 
   [ -e "${output_file}" ] || return 1
 
   local md5_last_frame=$(tail -n1 "${output_file}")
-  echo "${md5_last_frame% *}" | tr -d [:space:]
+  local actual_md5=$(echo "${md5_last_frame% *}" | tr -d [:space:])
+  [ "${actual_md5}" = "${expected_md5}" ] || return 1
 }
 
 decode_to_md5_vp8() {
@@ -47,8 +50,7 @@ decode_to_md5_vp8() {
   local expected_md5="56794d911b02190212bca92f88ad60c6"
 
   if [ "$(vp8_decode_available)" = "yes" ]; then
-    local actual_md5="$(decode_to_md5 "${VP8_IVF_FILE}" vp8)" || return 1
-    [ "${actual_md5}" = "${expected_md5}" ] || return 1
+    decode_to_md5 "${VP8_IVF_FILE}" "vp8" "${expected_md5}"
   fi
 }
 
@@ -57,8 +59,7 @@ decode_to_md5_vp9() {
   local expected_md5="2952c0eae93f3dadd1aa84c50d3fd6d2"
 
   if [ "$(vp9_decode_available)" = "yes" ]; then
-    local actual_md5="$(decode_to_md5 "${VP9_IVF_FILE}" vp9)" || return 1
-    [ "${actual_md5}" = "${expected_md5}" ] || return 1
+    decode_to_md5 "${VP9_IVF_FILE}" "vp9" "${expected_md5}"
   fi
 }
 
diff --git a/test/decode_with_drops.sh b/test/decode_with_drops.sh
index d0321bfb2603d2b7f28fee6861703765782d1032..82e934db245f1a4d4785d4bf54f430d62d71e3df 100755
--- a/test/decode_with_drops.sh
+++ b/test/decode_with_drops.sh
@@ -36,7 +36,7 @@ decode_with_drops() {
 
   [ -x "${decoder}" ] || return 1
 
-  "${decoder}" "${input_file}" "${output_file}" "${drop_mode}" > /dev/null 2>&1
+  eval "${decoder}" "${input_file}" "${output_file}" "${drop_mode}" ${devnull}
 
   [ -e "${output_file}" ] || return 1
 }
diff --git a/test/simple_decoder.sh b/test/simple_decoder.sh
index a0db58ff838eb39cd82a2971dd97970c43e086f7..24b17c5ef85beb6ba84394100dee2a9fc26e3a52 100755
--- a/test/simple_decoder.sh
+++ b/test/simple_decoder.sh
@@ -34,7 +34,7 @@ simple_decoder() {
 
   [ -x "${decoder}" ] || return 1
 
-  "${decoder}" "${input_file}" "${output_file}" > /dev/null 2>&1
+  eval "${decoder}" "${input_file}" "${output_file}" ${devnull}
 
   [ -e "${output_file}" ] || return 1
 }
diff --git a/test/simple_encoder.sh b/test/simple_encoder.sh
index 13f5e298b7329c02093abf2d43aebb44fa8f24ee..6232093c9873e7db03f00cdf5d6edfc9525a85d7 100755
--- a/test/simple_encoder.sh
+++ b/test/simple_encoder.sh
@@ -31,8 +31,9 @@ simple_encoder() {
 
   [ -x "${encoder}" ] || return 1
 
-  "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" "${YUV_RAW_INPUT_HEIGHT}" \
-      "${YUV_RAW_INPUT}" "${output_file}" 9999 > /dev/null 2>&1
+  eval "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \
+      "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" 9999 \
+      ${devnull}
 
   [ -e "${output_file}" ] || return 1
 }
diff --git a/test/tools_common.sh b/test/tools_common.sh
index 1ed017620ec6f3e7cbcadd927b2ceedfe6e3fcb3..30f0faea9c58c0c23ff3f9e2f61df83ba7f941f6 100755
--- a/test/tools_common.sh
+++ b/test/tools_common.sh
@@ -15,6 +15,7 @@ if [ -z "${VPX_TEST_TOOLS_COMMON_SH}" ]; then
 VPX_TEST_TOOLS_COMMON_SH=included
 
 set -e
+devnull='> /dev/null 2>&1'
 
 vlog() {
   [ "${VPX_TEST_VERBOSE_OUTPUT}" = "yes" ] && echo "$@"
@@ -197,9 +198,9 @@ vpxdec() {
   local decoder="${LIBVPX_BIN_PATH}/vpxdec${VPX_TEST_EXE_SUFFIX}"
 
   if [ -z "${pipe_input}" ]; then
-    "${decoder}" "$input" --summary --noblit "$@" > /dev/null 2>&1
+    eval "${decoder}" "$input" --summary --noblit "$@" ${devnull}
   else
-    cat "${input}" | "${decoder}" - --summary --noblit "$@" > /dev/null 2>&1
+    cat "${input}" | eval "${decoder}" - --summary --noblit "$@" ${devnull}
   fi
 }
 
@@ -245,14 +246,16 @@ vpxenc() {
   fi
 
   if [ -z "${pipe_input}" ]; then
-    "${encoder}" --codec=${codec} --width=${width} --height=${height} \
+    eval "${encoder}" --codec=${codec} --width=${width} --height=${height} \
         --limit=${frames} ${use_ivf} ${extra_flags} --output="${output}" \
-        "${input}" > /dev/null 2>&1
+        "${input}" \
+        ${devnull}
   else
     cat "${input}" \
-        | "${encoder}" --codec=${codec} --width=${width} --height=${height} \
-            --limit=${frames} ${use_ivf} ${extra_flags} --output="${output}" - \
-            > /dev/null 2>&1
+        | eval "${encoder}" --codec=${codec} --width=${width} \
+              --height=${height} --limit=${frames} ${use_ivf} ${extra_flags} \
+              --output="${output}" - \
+              ${devnull}
   fi
 
   if [ ! -e "${output}" ]; then
@@ -336,6 +339,7 @@ cat << EOF
     --run-disabled-tests: Run disabled tests.
     --help: Display this message and exit.
     --test-data-path <path to libvpx test data directory>
+    --show-program-output: Shows output from all programs being tested.
     --verbose: Verbose output.
 
     When the --bin-path option is not specified the script attempts to use
@@ -388,6 +392,9 @@ while [ -n "$1" ]; do
     --verbose)
       VPX_TEST_VERBOSE_OUTPUT=yes
       ;;
+    --show-program-output)
+      devnull=
+      ;;
     *)
       vpx_test_usage
       exit 1
@@ -445,6 +452,7 @@ vlog "$(basename "${0%.*}") test configuration:
   VPX_TEST_OUTPUT_DIR=${VPX_TEST_OUTPUT_DIR}
   VPX_TEST_VERBOSE_OUTPUT=${VPX_TEST_VERBOSE_OUTPUT}
   VPX_TEST_FILTER=${VPX_TEST_FILTER}
-  VPX_TEST_RUN_DISABLED_TESTS=${VPX_TEST_RUN_DISABLED_TESTS}"
+  VPX_TEST_RUN_DISABLED_TESTS=${VPX_TEST_RUN_DISABLED_TESTS}
+  VPX_TEST_SHOW_PROGRAM_OUTPUT=${VPX_TEST_SHOW_PROGRAM_OUTPUT}"
 
 fi  # End $VPX_TEST_TOOLS_COMMON_SH pseudo include guard.