diff --git a/libexec/bats-exec-test b/libexec/bats-exec-test index 8f3bd510..123f7ba0 100755 --- a/libexec/bats-exec-test +++ b/libexec/bats-exec-test @@ -48,17 +48,25 @@ load() { } run() { - local e E T oldIFS + local e E T oldIFS [[ ! "$-" =~ e ]] || e=1 [[ ! "$-" =~ E ]] || E=1 [[ ! "$-" =~ T ]] || T=1 set +e set +E set +T - output="$("$@" 2>&1)" - status="$?" + + eval "$({ t_sdterr=$({ t_stdout=$("$@"); t_ret=$?; } 2>&1; declare -p t_stdout >&2; declare -pi t_ret >&2); declare -p t_sdterr; } 2>&1)" + + status=$t_ret + output="${t_stdout}${t_sdterr}" + stdout=$t_stdout + stderr=$t_sdterr + oldIFS=$IFS IFS=$'\n' lines=($output) + IFS=$'\n' stdlines=($t_stdout) + IFS=$'\n' errlines=($t_sdterr) [ -z "$e" ] || set -e [ -z "$E" ] || set -E [ -z "$T" ] || set -T diff --git a/test/bats.bats b/test/bats.bats index f1aff293..32ae3d13 100755 --- a/test/bats.bats +++ b/test/bats.bats @@ -262,3 +262,8 @@ fixtures bats [ $status -eq 0 ] [ "${lines[1]}" = "ok 1 loop_func" ] } + +@test "testing stdout and stderr are separated" { + run bats "$FIXTURE_ROOT/stdout_stderr_separate.bats" + [ $status -eq 0 ] +} \ No newline at end of file diff --git a/test/fixtures/bats/stdout_stderr_separate.bats b/test/fixtures/bats/stdout_stderr_separate.bats new file mode 100644 index 00000000..ae83b310 --- /dev/null +++ b/test/fixtures/bats/stdout_stderr_separate.bats @@ -0,0 +1,14 @@ +# see issue #89 +echo_std_err() { + echo "std output" + (>&2 echo "err output") + return 0 +} + +@test "std err" { + run echo_std_err + [ $status -eq 0 ] + [ "${stdout}" = "std output" ] + [ "${stderr}" = "err output" ] + [ "${output}" = "std outputerr output" ] +}