2012-11-12 10 views
5

私は年月を経てシェルスクリプトを使用していません。 cmp_outが何であるかをシンプルなシェルスクリプトを理解するのに問題があります

#!/bin/sh 
# -*-sh-*- 
if gcc $1 &> cmp_out; then 
    if ! ./a.out &> run_out; then 
     exit 0;     # Success. 
    fi 
fi 
exit 1;       # Failure. 

、およびrun_out:私はここに

は、私が理解しようとしているコードです。..助けをオンラインで検索しましたが、十分なガイドを見つけることができますか?これらのstd_outはありますか?

私は、&>が転送指示であることを知っています。しかし、私はこのスクリプトの構文が意味するものを少しでも得られません。

このスクリプトの機能の概要を探しています。なぜ私がこのスクリプトを使用しているかについての詳細が必要な場合は、私に教えてください。私はその理由についてもっと詳しく説明します。

要するに、それは(//www.st.cs.uni-saarland.de/dd/)

+0

'cmp_out'はコンパイルの出力、' run_out'は結果の実行可能ファイルの実行結果です。 –

+0

ファイル出力はリダイレクトされています。 – John3136

+1

ロジックはちょっと面白いです:a.outに0以外の終了ステータスがある場合、それは成功ですか? –

答えて

1

このスクリプトでは、ソースファイルの名前を引数とします。そのソースファイルをgccでコンパイルし、そのコンパイルが成功すると結果が実行されます。スクリプトはcmp_outというファイルに出力(標準出力と標準エラー出力の両方)を節約するために(デフォルトでは、gcca.outという名前のファイルとして実行可能ファイルを書き込みます。)

をコンパイルが失敗した場合、あなたは、運がいい。そして、実行された結果が何らかの出力を生成した場合、それはrun_outに保存されます。スクリプト自体は、stderrまたはstdoutに何も書き込まれません。 gccが見つからない場合でも、そのエラーはcmp_outになります。

スクリプトに関して最も奇妙なことは、ifの後の感嘆符を使用して、実行の終了ステータスを逆転させることです。 a.outの実行に失敗すると、スクリプトは0で成功します。 a.outが成功すると、スクリプトは1で終了し、失敗します。これは、コンパイルが失敗した場合も同様です。たぶん、感嘆符は誤りですか?整数後のセミコロンは不要です。

+0

これは、CSクラスで使用される「デルタデバッグ」パッケージからのものです。入力が失敗を引き起こした場合、それは「成功した」テストケースとみなされます。 http://delta.stage.tigris.org/using_delta.html – dana

2

>という名前のファイルに先行するコマンドの標準出力をリダイレクトデルタデバッグのインクルード例です。 &>は、標準出力と標準エラーの両方をリダイレクトします。

したがってcmp_outは、標準出力と標準エラー出力をコンパイラから受け取るファイル名です。 run_outは、a.out(おそらくgccコマンドで構築されたバイナリ)から標準出力と標準エラーを受け取ります。

1

「&>」という略式の構文がbashのものであり、通常のshシェルでは機能しないというバグもあります。最初の行は "#!/ bin/bash"でなければなりません。

関連する問題