
私は次の課題を受けました。 *.tex ファイルをコマンドライン引数として使用し、ファイルがエラーなしで正しく実行されることを確認する Bash スクリプトを作成します。エラーや警告なしで実行されると、ファイルにタグ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を印刷するとファイルにタグ0が割り当てられます。
ただし、このプログラムを自動コード評価者に提供する必要があります。その後、私のコードをチェックし、すべての場合に私のコードが正しいかどうかを教えてくれます。
どうすればいいですか?
答え1
対話型入力を待たないようにpdflatexに指示します。
pdflatex -interaction nonstopmode "$1"
コマンドがゼロ以外の状態($?
)を返すと、エラーが発生したため0になります。それ以外の場合は、ログファイル($1
既存の拡張子の代わりに使用.log
)に単語が含まれているかどうかをテストしますWarning
。そうであれば1と表示され、そうでなければ0と表示されます。
答え2
通常、シェルスクリプトにユーザー入力を読み込もうとするプログラムがある場合は、スクリプトの上部に次を追加してこれを回避できます。
exec < /dev/null
これは、スクリプトがキーボードではなく/ dev / nullから入力を読み取るように指示します。これ以降のコマンドが入力を読み取ろうとすると、すぐにファイルの終わりを受け取ります。