나에겐 펄이 있어요스크립트이를 위해서는 다음 매개변수가 필요합니다.
count.pl OUTPUT_FILE INPUT_FILE
내가 원하는 것은 INPUT_FILE을 명시적으로 지정하는 대신 프로세스 대체를 사용하는 것입니다. 예를 들면 다음과 같습니다.
count.pl count.txt <(cat test.txt)
그러나 스크립트는 프로세스 교체로부터 어떠한 입력도 받지 못하는 것 같습니다.
내가 뭘 잘못했나요?
답변1
스크립트사용-T the-source-file
파일에 포함되어 있는지 확인텍스트.
이 -T
연산자는 파일의 시작 부분을 읽고 경험적 방법을 사용하여 텍스트처럼 보이는지 확인합니다. 그러나 파일이 <(...)
이 예제와 같은 파이프인 경우 읽은 내용을 다시 읽을 수 없습니다.
다음을 통해 이를 재현할 수 있습니다.
$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)
1861
1862
1863
1864
1865
1866
1867
-T
8KiB의 데이터가 출력에서 소비되어 더 이상 루프 seq
에서 읽을 수 없는지 확인하세요 .while <F>
=(...)
여기에서는 파이프 대신 임시 파일을 사용하는 zsh 및 해당 프로세스 대체 양식을 사용할 수 있습니다 . 아니면 껍질 (... | psub -f)
에 . fish
또는 -T
스크립트에서 호출을 제거하십시오. 또는 <<>>
/와 함께 작동하고 <>
(파일 인수가 전달되지 않은 경우 stdin에서도 작동함) stdout에서 출력되도록 스크립트를 다시 작성하십시오 . 스트리밍 방식으로 모든 파일을 처리하기 때문에 파일 이름을 매개 변수로 사용하는 요점을 정말로 이해하지 못합니다.