「同じパイプで同じファイルを読み書きしないように注意してください」

「同じパイプで同じファイルを読み書きしないように注意してください」

シェルチェックレポート:

echo -e "blah/blah\n$(cat "$tmpdir"/"$filename".jpdf)" > "$tmpdir"/"$filename".jpdf
                          ^-- SC2094: Make sure not to read and write the same file in the same pipeline.
                                                         ^-- SC2094: Make sure not to read and write the same file in the same pipeline.

blah/blahこのコマンドの目的は、ファイルの先頭に行を挿入することです"$tmpdir"/"$filename".jpdf

「同じパイプで同じファイルを読み書きしないでください」とはどういう意味ですか?

どうすればいいですか?

ありがとうございます。

ベストアンサー1

他の回答で指摘したように、同じファイルを読み書きすると、ファイルが消去されるという警告が表示されます。その理由は、>入力が完了する前にファイルが切り捨てられるためです。

2つの選択肢があります。

  1. sponge梱包を取り外して使用してくださいmoreutilssponge次のコマンドにパイプする前に、入力が完全に消費されていることを確認してください。

    変える

    command "$file" > "$file"
    

    する

    command "$file" | sponge "$file"
    
  2. 出力を別のファイルにリダイレクトし、名前を変更します。

    このように

    command "$file" > "$file2" && mv "$file2" "$file"
    

特定の質問に関連してファイルに「何か、あまりにも」を追加すると、そのsedオプションがサポートされている場合に-i機能します。例えばGNU sed:

sed '1i\
blah/blah' -i "$file"

おすすめ記事