주택 검사이 코드 줄에 대해 다음 오류가 표시됩니다.
printf '%d' $(($(< "$1") + 1)) > "$1"
동일한 파이프에서 동일한 파일을 읽고 쓰지 않도록 주의하세요.
이게 정말 문제인가요? 동일한 파일을 읽고 쓰면 경쟁 조건이 발생합니까?
답변1
예, 문제입니다. 동일한 파이프에서 읽고 쓸 수 없습니다. 이렇게 생각해보세요. 파일에 쓰면 파일이 비어 있게 되고, 파일을 읽으면 결과가 나오지 않습니다.
답변2
예, 동일한 파일을 병렬로 읽고 쓰면 경쟁 조건이 발생할 수 있습니다. 동일한 명령을 사용하여 동일한 파일의 입력 및 출력 리디렉션을 수행하면 파일 읽기를 시작하기 전에 파일이 잘립니다.
하지만 아니요, 여기서 일어나는 일은 그렇지 않습니다. 이는 Shellcheck의 잘못된 긍정입니다. 여기서 리디렉션은 산술 표현식 내부에 있습니다. 리디렉션이 수행되기 전에 모든 대체(산술, 변수, 명령, 분할 및 와일드카드)가 수행됩니다. 따라서 > "$1"
파일이 열리면 읽기 비트가 완료됩니다.