Shellcheckは、同じパイプで同じファイルを読み書きしないでくださいと文句を言います。

Shellcheckは、同じパイプで同じファイルを読み書きしないでくださいと文句を言います。

住宅検査このコード行に対して、次のエラーが表示されます。

printf '%d' $(($(< "$1") + 1)) > "$1"

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

これは本当に問題ですか?同じファイルを読み書きすると、競合状態が発生しますか?

答え1

はい、問題です。同じパイプで読み書きできません。こう考えてみてください。ファイルに書き込むとファイルが空になり、ファイルを読むと結果が出ません。

答え2

はい、同じファイルを並行して読み書きすると、競合状態が発生する可能性があります。同じコマンドを使用して同じファイルの入出力リダイレクトを実行すると、ファイルの読み取りを開始する前にファイルが切り捨てられます。

しかし、いいえ、ここで起こっていることはそうではありません。これはShellcheckの間違った肯定です。ここで、リダイレクトは算術式の内側にあります。リダイレクトが実行される前に、すべての置換(算術、変数、コマンド、分割、およびワイルドカード)が実行されます。これにより、> "$1"ファイルが開かれると読み出しビットが完了する。

関連情報