더 짧게 쓰는 방법이 있나요? 기본적으로 명령을 파일로 출력한 후 해당 파일을 다음 명령의 입력으로 사용합니다. 나중에 볼 수 있도록 파일을 보관하고 싶습니다.
cmd1 > verylong.txt; cmd2 < verylong.txt
나도 할 수 있다는 걸 알아
cmd1 | tee verylong.txt | cmd2
그러나 "verylong.txt"는 거대한 파일이 될 것으로 예상하므로 파이프를 사용하면 전체 파일을 메모리에 보관하므로 효율성이 떨어질 것이라고 생각합니다. 반면 파일 입력을 사용하면 한 번에 한 줄씩 처리됩니다. (아니면 제 추측이 틀렸나요?)
이렇게 우아한 일을 할 수 있다면 참 좋을 것 같아요
cmd1 > verylong.txt > cmd2
답변1
제가 아는 한, cmd1 | tee verylong.txt | cmd2
파일 전체가 메모리에 저장되지 않습니다. 실제로 cmd2
입력을 소비하기 전에 너무 오래 기다리면 cmd1
호출을 차단 write
하고 cmd2
다시 읽기 시작할 때만 잠금 해제될 수 있습니다.
그 이유는 파이프에 기본적으로 버퍼가 있기 때문입니다.특정 합리적인 크기로 제한됨.
물론 명령이 출력을 쓰기 전에 전체 입력을 읽어야 하는 경우(또는 유사한 경우) 상황은 cmd2
다를 수 있습니다 sort
. 이 경우 전체 파일 내용이 cmd2
메모리에 유지될 수 있지만 이는 명령에 대한 입력으로 파이프 또는 중간 파일이 사용되는지 여부와 무관합니다.
답변2
이미 주어진 대답은 정확합니다. 그러나 목표가 verylongfile.txt
w/를 선택적으로 읽는 cmd2
것이라면 sed
다른 옵션이 있을 수 있습니다.
cmd1 | sed -e 'w verylongfile.txt' -e '/notinteresting/d' | cmd2
sed
모든 입력을 출력 파일에 기록하지만 w
파이프 주소와 일치하지 않는 비트만 기록합니다. 또는 파이프 주소와 일치하는 행만 작성 /notinteresting/
하는 작업을 무효화할 수도 있습니다 ./interesting/!d
interesting
이것이 목표가 아니라면 tee
대신 사용하세요. 모든 입력을 출력 파일과 파이프에 쓰는 더 효율적인 도구입니다.
답변3
티와 서브쉘에 대한 깔끔한 트릭이 있습니다.
cat source.lst | tee >(doSomething.sh) >(somethingElse.sh) | somethingFinal.sh
나는 전에 이것을 해본 적이 있습니다.
pv -perl source.list | tee >(doSomething.sh) >(somethingElse.sh) | md5sum
pv
진행률 표시줄, 예상 도착 시간, 운행 중인 총 경로 수가 표시됩니다. 그런 다음 source.lst는 doSomething.sh 및 someElse.sh(및 다른 CPU에 있음)에 공급됩니다. 마지막으로 학문적 목적으로 해당 큰 파일의 md5sum을 가져옵니다.
답변4
간단한 두 줄 배치 파일에 어떤 문제가 있나요? 좋다:
Cmd1 >filespec
Cmd2 <filespec
또는
cmd1 >filespec
cmd2 filespec
어느 쪽이든 파일은 대용량 저장소에 남아 있습니다.