다음과 같은 방법으로 문제를 해결할 수 있습니다.
cat file | some_sed_command | tee file >/dev/null
없음 .
가능성 file
은 줄어 들지만 잘리지 않는다는 보장 cat file | some_sed_command | tee file >/dev/null
은 없습니다 file
.
파이프의 명령은 왼쪽에서 오른쪽으로 처리되지 않으므로 예상되는 것과는 달리 어떤 명령이 먼저 처리되는지에 달려 있습니다 . 일뿐만 아니라 단지 무작위로 고른으로 생각하고 수 있도록 명령을 먼저 포착 될에 대한 보장은 없다 결코 쉘이 잘못된 하나를 따기 여부에 의존하지 않습니다.
위반 명령이 세 명령 사이에서 먼저 선택 될 가능성이 두 명령 사이에서 처음으로 선택 될 가능성보다 낮기 file
때문에 잘릴 가능성은 적지 만 여전히 발생 합니다.
script.sh
:
#!/bin/bash
for ((i=0; i<100; i++)); do
cat >file <<-EOF
foo
bar
EOF
cat file |
sed 's/bar/baz/' |
tee file >/dev/null
[ -s file ] &&
echo 'Not truncated' ||
echo 'Truncated'
done |
sort |
uniq -c
rm file
% bash script.sh
93 Not truncated
7 Truncated
% bash script.sh
98 Not truncated
2 Truncated
% bash script.sh
100 Not truncated
따라서 같은 것을 사용 하지 마십시오 cat file | some_sed_command | tee file >/dev/null
. sponge
Oli가 제안한대로 사용하십시오 .
대안으로, 더 단단한 환경 및 / 또는 상대적으로 작은 파일의 경우 명령이 실행되기 전에 here 문자열과 명령 대체를 사용하여 파일을 읽을 수 있습니다.
$ cat file
foo
bar
$ for ((i=0; i<100; i++)); do <<<"$(<file)" sed 's/bar/baz/' >file; done
$ cat file
foo
baz