处理 shell 脚本中不可执行的命令

处理 shell 脚本中不可执行的命令

我收到了这样的作业:编写一个 Bash 脚本,将 *.tex 文件作为命令行参数,并检查该文件是否正确执行,没有任何错误。如果执行时没有任何错误和警告,则为该文件分配标记 2。 (如果编译时出现警告则为 1 标记,如果显示错误则为 0 标记)。

我可以为没有任何警告的文件和发出警告的文件分配标记。在这里,我给出了我的代码的一些行,

#!/bin/bash
rm t.txt
pdflatex $1 >> t.txt
message=`tail -2 t.txt|grep -i "output"|cut -c 1-6`

执行命令后pdflatex,我的脚本会搜索适当的单词,例如“输出”和“警告”,并相应地分配标记。但如果文件有错误,则pdflatex仅当我们给出“x”时该命令才会退出。由于它期待用户输入“x”,因此它会在那里等待。如果我运行该脚本,它不会显示任何输出;但如果我打印 x,它会将标记分配给该文件为零。

但我必须将此程序提供给自动代码评估器,它会检查我的代码,并告诉我的代码在所有情况下是否正确......

我该如何做到这一点?

答案1

告诉 pdflatex 不要等待任何交互式输入:

pdflatex -interaction nonstopmode "$1"

如果该命令返回非零状态 ( $?),则存在错误,因此标记为 0。否则,测试日志文件(如$1,但使用.log而不是已有的扩展名)是否包含单词Warning;如果是,则标记为 1,否则标记为 0。

答案2

在一般情况下,如果您的 shell 脚本中有一个程序尝试读取用户的输入,您可以通过在脚本顶部添加以下内容来阻止它:

exec < /dev/null

这告诉脚本从 /dev/null 而不是从键盘读取输入。如果此后的任何命令尝试读取输入,它将立即收到文件结尾。

相关内容