9

私は昔からシェルスクリプトを使っていません。オンラインでヘルプを検索しましたが、適切なガイドが見つかりませんでした。

これが私が理解しようとしているコードです:

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

cmp_outおよびrun_outとは何ですか?これらはstd_outですか?

&>がリダイレクト命令であることを知っています。しかし、私はこのスクリプト構文でそれが何を意味するのかを少しでも理解していません。

このスクリプトが実行していることの概要を探しています。このスクリプトを使用している理由についてさらに情報が必要な場合は、お知らせください。その理由について詳しく説明します。

要するに、これはデルタデバッグの含まれている例です(//www.st.cs.uni-saarland.de/dd/)

4

3 に答える 3

4

このスクリプトは、ソースファイルの名前という1つの引数を取ります。そのソースファイルをでコンパイルしgcc、そのコンパイルが成功すると結果を実行します。(デフォルトでは、実行可能ファイルを。gccという名前のファイルとして書き込みますa.out。)

スクリプトが出力(標準出力と標準エラーの両方)を。というファイルに保存するため、コンパイルが失敗した場合は幸運ですcmp_out。そして、実行された結果が出力を生成する場合、それはに保存されrun_outます。スクリプト自体は、stderrまたはstdoutに何も書き込みません。gccが見つからない場合でも、そのエラーはで終了しcmp_outます。

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

于 2012-11-13T03:24:06.660 に答える
3

>上記のコマンドの標準出力を名前付きファイルにリダイレクトします。 &>標準出力と標準エラーの両方をリダイレクトします。

コンパイラcmp_outからの標準出力と標準エラー出力を受け取るファイル名も同様です。 (おそらくコマンドによって作成されたバイナリ)run_outから標準出力と標準エラーを受け取ります。a.outgcc

于 2012-11-12T22:06:41.517 に答える
3

プログラムにはバグもあり、「&>」の省略構文はbashであり、通常のshシェルでは機能しません。最初の行は「#!/ bin/bash」である必要があります。

于 2016-03-03T01:36:08.147 に答える