mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2094 (markdown)
24
SC2094.md
Normal file
24
SC2094.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# SC2094 Make sure not to read and write the same file in the same pipeline.
|
||||||
|
|
||||||
|
### Problematic code:
|
||||||
|
|
||||||
|
grep foo file.txt | sed -e 's/foo/bar/g' > file.txt
|
||||||
|
|
||||||
|
### Correct code:
|
||||||
|
|
||||||
|
grep foo file.txt | sed -e 's/foo/bar/g' > tmpfile && mv tmpfile file.txt
|
||||||
|
|
||||||
|
### Rationale:
|
||||||
|
|
||||||
|
Each step in a pipeline runs in parallel.
|
||||||
|
|
||||||
|
In this case, `grep foo file.txt` will immediately try to read `file.txt` while `sed .. > file.txt` will immediately try to truncate it.
|
||||||
|
|
||||||
|
This is a race condition, and results in the file being partially or (far more likely) entirely truncated.
|
||||||
|
|
||||||
|
### Contraindications
|
||||||
|
|
||||||
|
You can ignore this error if:
|
||||||
|
|
||||||
|
* The file is a device or named pipe. These files don't truncate in the same way.
|
||||||
|
* The command mentions the filename but doesn't read/write it, such as `echo log.txt > log.txt`.
|
Reference in New Issue
Block a user