파이프를 사용하여 파일에 추가하면 추가되지 않지만 덮어씁니다.

파이프를 사용하여 파일에 추가하면 추가되지 않지만 덮어씁니다.

달리기:

cat .bashrc | sed s/HISTFILESIZE=.*/HISTFILESIZE=10000/ >> .bashrc | echo 'HISTTIMEFORMAT="%F %T "' >> .bashrc

.bashrc가 반복될 것으로 예상됩니다(>> 지시문 사용).

단, 중복은 없습니다. 설명은 무엇입니까?

답변1

.bashrc가 반복될 것으로 예상됩니다(>> 지시문 사용).

파일의 내용을 복사해야 합니다. 예. cat파일의 내용이 인쇄되어 sed모두 그대로 전달되며, 추가된 리디렉션을 통해 인쇄된 내용이 파일의 끝에 도달하도록 보장하므로 읽고 있는 부분과 쓰는 부분이 부분적으로 겹치지 않습니다.

$ cat test.txt
hello
world
$ cat test.txt
hello
world
new line
hello
world
new line

콘텐츠를 복사하는 것이 .bashrc유용해 보이지는 않습니다. 또한 타이밍이 어떻게 작동하는지에 따라 cat새로 작성된 복제본이 다시 읽혀질 수도 있으며, 이로 인해 더 많은(최악의 경우 무제한) 중복이 발생할 수 있습니다. 이는 무엇보다도 파일 크기에 따라 달라질 수 있습니다. 작은 파일은 cat전체 내용을 읽고 더 쓰기 전에 EOF를 볼 가능성이 높기 때문입니다.

파이프 ... >> file | echo ...는 약간 우스꽝스럽습니다. 왼쪽의 리디렉션이 두 명령을 연결하는 파이프를 덮어쓰고 echo어쨌든 입력을 읽지 않기 때문입니다. 파이프라인의 각 부분이 동시에 시작되기 때문에 echo왼쪽의 출력이 실행 전인지 후인지 알 수 없다는 추가적인 문제가 있습니다.

이제 zsh를 사용하게 되면 상황이 달라집니다. set을 통해 zsh는 프로세스 multios의 출력을 정렬합니다.sed둘 다파이프와 파일에. 그러나 echo파이프에서 아무것도 읽히지 않으므로(빠르게 완료될 수 있음) zsh의 도우미 프로세스가 파이프에 쓸 때 SIGPIPE 신호로 종료되고 파일에 쓰지 않습니다. 다음과 같은 내용이 표시되어야 합니다 seq 10 > foo.txt | true. 이는 나에게 빈 파일을 제공했습니다.

그러니 ... >> file; echo ...대신에 그것을 사용하세요.

파일의 일부를 수정하려는 경우 sed -i유용할 수 있습니다 . 그래서:

sed -i 's/HISTFILESIZE=.*/HISTFILESIZE=10000/' .bashrc
echo 'HISTTIMEFORMAT="%F %T "' >> .bashrc

관련 정보