web-dev-qa-db-ja.com

Shellcheckは、同じパイプラインで同じファイルを読み書きしてはいけないと文句を言います

ShellCheck このコード行に対して次のエラーを表示します。

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

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

これは本当に問題ですか?同じファイルを読み書きすると、競合状態になる可能性がありますか?

3
helpermethod

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

しかし、いいえ、これはここで起こっていることではありません。 Shellcheckでは誤検知です。ここで、リダイレクトは算術式の内部にあります。すべての置換(算術、変数、コマンド、および分割とグロブ)は、リダイレクトが実行される前に実行されます。だからその時> "$1"ファイルを開き、読み取りビットが終了します。

はい、これは問題です。同じパイプとの間で読み取りと書き込みを行うことはできません。このように考えてください。ファイルを書き込むと、ファイルは空として開始するように設定され、ファイルから読み取ると何も生成されません。

3
proycon