私はいつかダミーエラーを出力するコンパイラを扱わなければなりません。私はその場合、私のビルドプロセスを止めたくありません。代わりに、私は単にエラーを無視して、コンパイラを再実行したい:
%o: %c
$(prefix) dumb_compiler -c $^ -o [email protected] $(suffix)
私の目標は、ダミーのエラーを無視する$prefix
と$suffix
として何かを定義することです。代わりにdumb_compiler
の者は、単にこのダミーのプログラムを考えてみましょう:
#!/usr/bin/perl
my $i = int rand 10;
die "Error -42\n" if $i > 5;
die "Error -12\n" if $i % 2;
print "$i\n";
Error -42
が発生した場合、私はstdout
、stderr
を破棄し、何事もなかったかのように再度プログラムを実行したいです。それ以外の場合は、プログラムが印刷したものを印刷したい。
私はMakefile
レシピにそれを置くためにonelinerとしてbashで次のように記述したいと思います:
while True:
(_exit, _stdout, _stderr) = exec(program)
if _exit == 0 and "Error -42" not in _stderr:
print(stdout=_stdout, stderr=_stderr)
exit(_exit)
私は現在、これを書いたが、それは動作しません、それは似ていませんoneliner
#!/usr/bin/bash
exit_status=0
run=1
exec 3>&1
exec 4>&2
while [ $run -eq 1 ];
do
run=0
./program 2>&4 1>&3
$exit_status=$?
if [ $exit_status -ne 0 ]
then
&4 > grep -q "Error -42"
if [ $? -ne 0 ]:
then
run=1
fi
fi
done
3>&1
4>&2
3>&-
4>&-
exit $exit_status
私の質問はどのように私はきちんと私のプログラムの実行から標準出力、標準エラー出力と終了ステータスを保持し、私が終わったら、それを洗い流すことができますか?
まだ私のプログラムの仕事をしようとすることはできますが、私のアプローチは間違っていると思います。
あなたの例では、最後の 'cat'は' program'の終了ステータスではなく '$?'を返します。私が間違っている? – nowox
'/ tmp/output'、'/tmp/error'と一緒に '/ tmp'ディレクトリに侵入します。他のいくつかのプロセスが同じファイルを使用している場合、私は運命にある。そして、私はMakefileを '-j10'で実行するとこれが起こると思います。 – nowox
@nowoxこれらの一時ファイルは単なる例に過ぎません。 'stdout = $(mktemp)'、 'stderr = $(mktemp)'などを使ってください。 – bishop