2014-06-10 2 views
3

파일 을 (를) (이)가 지원되지 않는 프로그램 prog을 사용하여 수정해야합니다.배시 : 전체 표준 입력 버퍼링 후 출력

prog $file > $file.temp 
cat $file.temp > $file 
rm $file.temp 

임시 파일없이 한 번에 이렇게하고 싶습니다. 이 좋은 보이지만 작동하지 않습니다

cat <(prog $1) > $1 

그것은 것 내가 (쓰기 끝이 닫힐 때까지 차단) 파이프의 내용을 버퍼링하는 방법, 예를 들어이 있다면 일 :

cat <(prog $1 | buffer_until_close) > $1 

어떻게하면됩니까, 아니면 다른 방법으로 원하는 구문을 얻을 수 있습니까?

+4

어떨까요 [스폰지] (http://linux.die.net/man/1/sponge) – iruvar

+0

스폰지는 [더 많은 요즘] (https://github.com/madx/moreutils/blob/master)에 있어야합니다./debian/control) – Hastur

+0

왜 임시 파일에 대한 혐오감이 있습니까? 실제로 파일을 편집하는 것과 같은 것은 없습니다. 그렇게하는 것 같은 프로그램은 임시 파일을 만들고 그 파일로 원본을 대체하는 것에 대한 세부 사항을 숨 깁니다. – chepner

답변

4

내가 (쓰기 끝이 닫힐 때까지 차단) 파이프의 내용을 버퍼링하는 방법이 있다면 그것은 작동합니다, 예를 들면 :

cat <(prog $1 | buffer_until_close) > $1

아니,하지 않을 것입니다. stdout (>$1)의 리디렉션은 프로그램이 시작되기 전에을 행한다. 그리고 쉘이 리디렉션을 설정하자 마자 출력 파일이 잘립니다. 코멘트에 언급 한 바와 같이

그러나, sponge 작동합니다 :

prog $1 | sponge $1 

spongemoreutils 패키지에있는 대부분의 리눅스 배포판을 사전 설치됩니다.

+0

고마워! 뿐만 아니라 내가 찾고있는 것뿐만 아니라 귀중한 교훈 +1 – slezica