当我在当前 Bash 脚本中调用另一个 Bash 脚本时无法获得预期的输出



这是我的Bash脚本作业,我对程序的输出感到困惑。假设我需要使用脚本debugger.sh来调用脚本program.sh,直到第二个脚本失败,并捕获program.sh

的所有输出
user@user-machine:~$ cat program.sh
#!/usr/bin/env bash
n=$(( RANDOM % 100 ))
if [[ n -eq 42 ]]; then
echo "Something went wrong"
>&2 echo "The error was using magic numbers"
exit 1
fi
echo "Everything went according to plan"
user@user-machine:~$ cat debugger.sh
#! /bin/bash
touch info.txt
count=0
while [ 0 -eq 0 ]
do
./program.sh > info.txt
if [ $? -eq 1 ]
then
echo "failed at stage $count" > info.txt
break
fi
((count++))
done

当我在Bash shell中输入command ./debugger.sh时,我期望的结果:

user@user-machine:~$ ./debugger.sh
Something went wrong
user@user-machine:~$ cat info.txt
Everything went according to plan
Everything went according to plan
........
The error was using magic numbers
failed at stage....

但是实际结果是:

user@user-machine:~$ ./debugger.sh
The error was using magic numbers
user@user-machine:~$ cat info.txt
failed at stage 199

我不知道一些输出到哪里去了。为什么"The error was using magic numbers"出现在我的终端上,我认为应该重定向到info.txt文件。"Everything went according to plan"就消失了。它是如此奇怪,谁能解释?我的英语不是很好,希望你们能理解。我真的很感激你们。

这里有很多不相关的错误。

你比较的是字符串n和42,而不是变量$n,所以这当然总是会失败。

您正在覆盖每次迭代的输出文件,因此您正在覆盖来自所有先前迭代的诊断。

还有其他各种风格问题,其中许多问题http://shellcheck.net/将诊断并经常提出修复建议。

你的脚本在几个地方使用bash语法,所以你的问题不应该被标记为sh;参见sh和bash

的区别所有诊断消息都打印为标准错误,并包括负责的脚本的名称。

还有,为什么要测试"$?"来查看命令是否成功,反模式?

下面是一个重构,希望能解决这些问题。

#!/usr/bin/env bash
n=$(( RANDOM % 100 ))
if [[ $n -eq 42 ]]; then
echo "$0: Something went wrong" >&2
>&2 echo "$0: The error was using magic numbers"
exit 1
fi
echo "Everything went according to plan"

重构的调试循环收集每次运行的结果。日志文件包括计数,并捕获标准输出和标准错误。

#! /bin/bash
warn () {
echo "$0: $*" >&2
}
die () {
warn "$*"
exit 1
}
count=0
# notice change
while true
do
warn "run $count"
./program.sh ||
die "failed at stage $count"
((count++))
done >info.txt 2>&1

相关内容

  • 没有找到相关文章

最新更新