파일 자체를 "cat"하면 파일이 삭제되는 이유는 무엇입니까? [복사]

파일 자체를 "cat"하면 파일이 삭제되는 이유는 무엇입니까? [복사]

중복 가능성:
IO 리디렉션 및 헤드 명령

첫 번째 줄을 제외하고 파일의 모든 내용을 삭제하고 싶습니다. 나는 이걸했다:

head -1 foo.txt

...그리고 첫 번째 줄만 보이는지 확인하세요. 그런 다음 나는 다음을 수행했습니다.

head -1 foo.txt > foo.txt

그러나 이제 더 이상 첫 번째 행만 포함되지 않고 foo.txt비어 있습니다.

이로 인해 cat foo.txt > foo.txt파일도 지워졌습니다.

왜?

답변1

쉘이 데이터 처리를 시작하기 전에 모든 입력과 출력이 제곱되었는지 확인해야 합니다.

따라서 귀하의 경우 > foo.txt기본적으로 사용은 시스템에 "이름이 지정된 (새) 파일을 만들고 foo.txt이 명령의 모든 출력을 해당 파일에 붙여넣습니다"라고 지시합니다.

아시다시피 문제는 이전 내용이 지워진다는 것입니다.

관련된, >>것입니다추가의기존 파일에.

고쳐 쓰다:

이것은 사용된 솔루션입니다 sed. 주의해서 다루십시오.

 sed -i '2,$d' foo.txt

"마지막"까지 2번째 줄을 삭제합니다.제자리에파일에 foo.txt. 엉망으로 만들 수 있는 파일에서 먼저 시도해 보는 것이 좋습니다. :)

이 명령의 약간 수정된 버전은 .bak다음 확장명을 사용하여 원본 버전의 복사본을 유지합니다.

 sed -i.bak '2,$d' foo.txt

명령줄 스위치 뒤에 -i"백업"(즉, 원본) 파일의 이름으로 일련의 문자(또는 단일 문자)를 지정할 수 있습니다.

답변2

호출하는 쉘이 cat로 표시된 리디렉션을 수행하기 때문입니다 >.

쉘(bash, zsh, ksh, dash 등)은 명령을 읽습니다 cat foo.txt > foo.txt. 쉘은 로 표시된 리디렉션을 설정해야 합니다 > foo.txt. >맨 위에서부터 파일을 쓰는 것을 의미하며, >>foot.txt에 추가하는 것을 의미합니다.

쉘이 실제로 cat실행되면 foo.txt가 사라졌습니다.

관련 정보