我用 C++ 编写了一个程序,现在我有了一个二进制文件。我还生成了一堆用于测试的测试。现在我想用 bash 自动化测试过程。我想在我的二进制文件的一次执行中保存三件事:
现在我正在使用一个脚本,该脚本只测试二进制文件是否完成其工作并返回 0,并且不保存我上面提到的任何信息。我的脚本看起来像这样
#!/bin/bash
if [ "$#" -ne 2 ]; then
echo "Usage: testScript <binary> <dir_with_tests>"
exit 1
fi
binary="$1"
testsDir="$2"
for test in $(find $testsDir -name '*.txt'); do
testname=$(basename $test)
encodedTmp=$(mktemp /tmp/encoded_$testname)
decodedTmp=$(mktemp /tmp/decoded_$testname)
printf 'testing on %s...\n' "$testname"
if ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then
echo 'encoder failed'
rm "$encodedTmp"
rm "$decodedTmp"
continue
fi
if ! "$binary" -u -f $encodedTmp -o $decodedTmp > /dev/null; then
echo 'decoder failed'
rm "$encodedTmp"
rm "$decodedTmp"
continue
fi
if ! diff "$test" "$decodedTmp" > /dev/null ; then
echo "result differs with input"
else
echo "$testname passed"
fi
rm "$encodedTmp"
rm "$decodedTmp"
done
Run Code Online (Sandbox Code Playgroud)
我想将输出保存$binary
在变量中而不是将其发送到/dev/null
. 我也想使用time
bash 功能节省时间
当您要求将输出保存在 shell 变量中时,我尝试在不使用输出重定向 \xe2\x80\x93 的情况下回答这个问题,它将输出保存在(临时)文本文件中(然后必须对其进行清理)。
\n\n你可以替换这一行
\n\nif ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then\n
Run Code Online (Sandbox Code Playgroud)\n\n和
\n\nif ! output=$("$binary" -c -f $test -o $encodedTmp); then\n
Run Code Online (Sandbox Code Playgroud)\n\n使用命令替换将程序输出保存$binary
在 shell 变量中。命令替换(与 shell 变量赋值相结合)还允许将程序的退出代码传递到调用 shell,以便条件if
语句将继续检查是否$binary
执行时没有错误。
您可以通过运行来查看程序输出echo "$output"
。
如果没有更复杂的进程间通信形式,则作为另一个 shell 的子进程的 shell 无法更改其父进程的变量或环境,因此我可以节省时间和程序输出的唯一方法是将它们组合在一个变量中:
\n\nif ! time-output=$(time "$binary" -c -f $test -o $encodedTmp) 2>&1); then\n
Run Code Online (Sandbox Code Playgroud)\n\n由于time
将其分析信息打印到,因此我使用括号运算符在可以重定向到 的stderr
子 shell 中运行命令。可以通过运行查看编程输出和时间输出,它应该返回类似以下内容的内容:stderr
stdout
echo "$time-output"
<program output>\n<blank line>\nreal 0m0.041s\nuser 0m0.000s\nsys 0m0.046s\n
Run Code Online (Sandbox Code Playgroud)\n