달리기:
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