0

テキスト行をファイルに出力し、さらにデータを同じファイルに出力する 2 番目のスクリプトを呼び出す bash スクリプトがあります。それらをscript1.shおよびscript2.shと呼びましょう。2 つのスクリプトに分割されている理由は、script2.sh のバージョンが異なるためです。

script1.sh:

rm -f output.txt
echo "some text here" > output.txt
source script2.sh

script2.sh:

./read_time >> output.txt
./run_program
./read_time >> output.txt

script2.sh の 3 行のバリエーションが繰り返されます。

これはほとんどの場合うまくいくようですが、ときどきファイル output.txt に「some text here」という行が含まれていません。最初は、次のように script2.sh を呼び出していたためだと思いました./script2.sh。しかしsource、問題を使用してもまだ発生します。問題は再現性がないため、何かを変更しようとしても、実際に修正されているかどうかはわかりません。

何が原因でしょうか?

編集: スクリプトは非常に単純です。script1 はここに表示されているものとまったく同じですが、ファイル名が異なります。スクリプト 2 は私が投稿したものですが、同じ 3 行が繰り返され、./run_program異なる引数を持つことができます。出力ファイルに対してgrepを実行しました>が、予期しない場所には表示されません。

これらのスクリプトの使用方法は、script1 がプログラムによって作成されることです (バージョン間の唯一の違いはsource script2.sh行です。この script1.sh は、ssh を使用して別のコンピューター (実際には FPGA 上の Linux) で実行されます。それが行われる前に)。 、出力ファイルもsshを使用して削除されます. 理由はわかりませんが、これをすべて書いたわけではありません. また、ホストで実行されているコードを確認しました. 出力ファイルの唯一の言及は、 ssh を使用して削除され、script1 の実行後にホストにコピーされます。

編集 2: script2.sh からファイルに出力される 1 行以外のすべてを削除することで、ようやく妥当な速度で問題を再現できるようになりました。これにより、テストを少し速く行うこともできました。これを取得すると、10回の実行ごとに1〜4回問題が発生しました。スクリプトを実行する前に ssh 経由でファイルを削除していたコマンドを削除すると、問題が解決したようです。念のためにもう少しテストしますが、解決したと思います。なぜそれが問題になるのかはまだわかりませんが。すべての削除コマンドが実行される前に、ssh コマンドが終了しないと思いました。

4

2 に答える 2

1

実際のコードを見ないとわかりません。最も可能性の高い説明は、script2.sh ファイルのどこかに>ではなくタイプミスがあることです。>>

これを確認するには、 でnoclobberオプションを設定しますset -o noclobber。で既存のファイルに書き込もうとすると、シェルは終了します>

別の可能性として、ファイルが特定のまれな条件下で削除されることがあります。または、ファイルにランダム アクセスできるコマンドによってファイルが破損しています>>。または、相互にステップする入力と出力の両方として、いくつかのコマンドで使用されます - で使用されるファイルを探します<

最後に、その前に開始された、バックグラウンドでファイルに出力するコマンドで競合状態を発生させることができますecho

于 2013-05-30T19:02:01.047 に答える