답변:
이 경우 리디렉션 (> 및 >>)의 두 가지 방법 사이에서 알아야 할 기본 사항은 다음과 같습니다.
정보가 지시 된 위치를 재지 정하고 덮어 씁니다 . 파이프 "|"를 통해 정보를받는 동안 발생합니다.
지정된 정보를 리디렉션하고 연결 합니다. 파이프 "|"를 통해 정보를받는 동안 발생합니다.
두 경우 모두 파일이 존재하지 않으면 대신 작성됩니다. 동일한 파일에서 정보를 다시 실행하면 ">>"에서만 정보가 연결됩니다. ">"를 사용하면 첫 번째 실행에서 수행 한 모든 작업을 덮어 씁니다.
그러나 출력 파일과 동일한 입력 파일을 사용할 때의 거래입니다. 이 경우 ">"를 사용하면 출력 파일이 "덮어 쓰기"이므로 "입력"부분을 구문 분석해야하는 정보가 제거됩니다. 그래서 :
rev file.txt | cat > file.txt
"슬로우 모션 설명"에서 실제로 일어나는 것은 다음과 같습니다.
rev내용을 뒤집어 file.txt파이프로 보낼 준비rev파이프로 정보를 보내는 동안 파이프는 정보를로 직접 스트리밍합니다 cat.cat정보를 수신하고 자동으로에 적용 file.txt이 설정되었다.catrev전체 파일을 파이프 하기 를 기다리지 않습니다 . 정보의 첫 번째 부분이 도착하는 순간부터 시작됩니다. 즉, 사용한 기호에 따라에 대한 연결이 열립니다 file.txt.file.txtfile.txtfile.txt에 > , rev그것의 일을하고 있기 때문에 아무 것도 얻을하려고 할 cat새로운 정보에 대한 준비를 삭제 다.왜 위의 내용을 읽은 후에 다른 사람들이 일하는가? 이것 때문에:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
여기에 정보를 다른 파일로 보내는 cat에 파이핑 중입니다 . 이 경우 처리 된 입력 파일 file.txt은 출력 파일과 다릅니다 file2.txt. 그 후 문자 그대로 전체 file2.txt를 덮어 쓰므로 file.txt모든 프로세스 cat가 삭제되었습니다. 기본적으로 전체 줄은 끝에서을 풀고 명령으로 덮어 쓰기 cp file.txt file2.txt때문에 동일한 작업을 수행하기 때문에 단순화 될 수 있습니다 .file2.txtrevmv
rev file.txt | cat >> file.txt
이 경우 정보를 동일한 파일에 연결 합니다. 따라서 해당 파일에 대한 연결 만 열지 만 단일 > 로 표시된 정보는 지워지지 않습니다 . 최종 결과는 원래 정보와 반전 된 정보 여야합니다.
rev file.txt | cat --bogus-option > file.txt에서는 잘리지 않지만 0 단계 에서는 잘립니다. cat이 파일을 열려고하지 않더라도 파일도 잘립니다.
moreutilsspongerev file.txt >file2.txt && mv file2.txt file.txtrev file.txt | sponge file.txtfile2.txt
쉘이 경로 재 지정을 볼 때, 관련된 명령을 실행하기 전에 관련 파일을 먼저 엽니 다. 따라서 할 때 :
foo file.txt | bar > file.txt
에 대한 재 지정 이 실행 되기 전에file.txt 잘려서 읽을 수 있습니다 . 참고로, 이것이 당신이 할 수없는 이유입니다. foofile.txt
sed 'blah' file.txt > file.txt
sed내부 편집 옵션이 왜 필요한 가요?
마지막으로 다음을 수행하십시오.
.. | cat > file.txt
이다 고양이의 쓸모없는 사용 이 읽는 중에 특히 그렇다면, file.txt에 이전은.
파일을 원래 위치로 되돌리려면 바로 가기가 없습니다 . 전체 편집에서 sed또는 awk트릭 을 사용할 수 있습니다 .
cat과 같이 남겨 둘 수도 있습니다rev file.txt > file2.txt && mv file2.txt file.txt.. 이것은 불필요한 사용입니다cat. 그것을 남겨두면 여분의 프로세스를 스폰시킬 수 있습니다.