답변:
이 경우 리디렉션 (> 및 >>)의 두 가지 방법 사이에서 알아야 할 기본 사항은 다음과 같습니다.
정보가 지시 된 위치를 재지 정하고 덮어 씁니다 . 파이프 "|"를 통해 정보를받는 동안 발생합니다.
지정된 정보를 리디렉션하고 연결 합니다. 파이프 "|"를 통해 정보를받는 동안 발생합니다.
두 경우 모두 파일이 존재하지 않으면 대신 작성됩니다. 동일한 파일에서 정보를 다시 실행하면 ">>"에서만 정보가 연결됩니다. ">"를 사용하면 첫 번째 실행에서 수행 한 모든 작업을 덮어 씁니다.
그러나 출력 파일과 동일한 입력 파일을 사용할 때의 거래입니다. 이 경우 ">"를 사용하면 출력 파일이 "덮어 쓰기"이므로 "입력"부분을 구문 분석해야하는 정보가 제거됩니다. 그래서 :
rev file.txt | cat > file.txt
"슬로우 모션 설명"에서 실제로 일어나는 것은 다음과 같습니다.
rev
내용을 뒤집어 file.txt
파이프로 보낼 준비rev
파이프로 정보를 보내는 동안 파이프는 정보를로 직접 스트리밍합니다 cat
.cat
정보를 수신하고 자동으로에 적용 file.txt
이 설정되었다.cat
rev
전체 파일을 파이프 하기 를 기다리지 않습니다 . 정보의 첫 번째 부분이 도착하는 순간부터 시작됩니다. 즉, 사용한 기호에 따라에 대한 연결이 열립니다 file.txt
.file.txt
file.txt
file.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.txt
rev
mv
rev file.txt | cat >> file.txt
이 경우 정보를 동일한 파일에 연결 합니다. 따라서 해당 파일에 대한 연결 만 열지 만 단일 > 로 표시된 정보는 지워지지 않습니다 . 최종 결과는 원래 정보와 반전 된 정보 여야합니다.
rev file.txt | cat --bogus-option > file.txt
에서는 잘리지 않지만 0 단계 에서는 잘립니다. cat이 파일을 열려고하지 않더라도 파일도 잘립니다.
moreutils
sponge
rev file.txt >file2.txt && mv file2.txt file.txt
rev file.txt | sponge file.txt
file2.txt
쉘이 경로 재 지정을 볼 때, 관련된 명령을 실행하기 전에 관련 파일을 먼저 엽니 다. 따라서 할 때 :
foo file.txt | bar > file.txt
에 대한 재 지정 이 실행 되기 전에file.txt
잘려서 읽을 수 있습니다 . 참고로, 이것이 당신이 할 수없는 이유입니다. foo
file.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
. 그것을 남겨두면 여분의 프로세스를 스폰시킬 수 있습니다.