파일 이름이 필요한 명령에 파이프를 전달하십시오.


19

foo파일 이름 인수를 취하는 명령 이 있다고 가정 해보십시오 foo myfile.txt. 성가신 foo표준 입력에서 읽지 않습니다. 실제 파일 대신 다른 명령의 결과를 전달하고 싶습니다 (실제로 pv파일을 cat하고 부작용으로 진행률을 출력합니다).

이를 가능하게하는 방법이 있습니까? 내 속임수 가방에는 아무것도하지 않는 것 같습니다.

( foo이 경우 파일을 순차적으로 처리한다고 생각되는 PHP 스크립트입니다).

우분투와 배쉬를 사용하고 있습니다.

편집 약간 분명하지 않은 문제 설명에 대해 죄송하지만 여기에 내가 원하는 것을 수행하는 답변이 있습니다.

pv longfile.txt | foo /dev/stdin

내가 본 지금 매우 분명합니다.


하나의 라이너를 찾고 있습니까?
Dave Forgac 2016 년

foo가 stdin에서 읽도록 "-"의 인수를 허용하지 않습니까?
rackandboneman 2016 년

슬프게도,이 경우에는 PHP 스크립트입니다.
Steve Bennett

예, 실제로 요 .
Steve Bennett

답변:


19

올바르게하고 싶은 것을 이해하면 bash의 명령 대체 기능을 사용하여 수행 할 수 있습니다.

foo <(somecommand | pv)

이것은 mkfifobash가 세부 정보를 처리한다는 점을 제외하고 는 ( 기반 이름이 지정된 파이프가 아닌 / dev / fd / 63과 같은 명령을 전달하는 것을 제외하고) 기반 응답이 제안 하는 것과 비슷한 것을 수행합니다 . 다음과 같이 직접 수행 할 수도 있습니다.

somecommand | pv | foo /dev/stdin

1
오 좋은 하나! 이것은 pv inputfile.txt | foo /dev/stdin내가 찾던 것이지만 생각하지 못했습니다.
Steve Bennett

우와! / dev / stdin
sage

<(.)나를 위해 일했다. 이 구문은 Bash 매뉴얼에 설명되어 있습니까? 이해가 (.)명령 치환이 설명되어 있지만, 그것의 조합을 보지 못했다으로 <설명했다.
flow2k

@ flow2k "프로세스 대체"라고 합니다. bash 매뉴얼의 섹션 3.5.6을 참조하십시오 .
Gordon Davisson

알았다. 당신이 옳습니다-명명 된 파이프 /를 사용한다고 언급합니다 mkfifo.
flow2k

2
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done

2

이 Unix SE 질문에는 임시 명명 된 파이프를 만드는 방법을 보여주는 답변이 있습니다.

쉘 스크립트 mktemp, 임시 명명 된 파이프를 생성하는 가장 좋은 방법은 무엇입니까?

답변을 바탕으로 다음과 같은 작업을 수행 할 수 있습니다.

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

그런 다음 파이프를 다음과 같이 볼 수 있습니다.

foo $tmppipe

그런 다음 완료되면 삭제하십시오.


1

mkfifo를 사용해보십시오.

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

다른 쉘에서 foo file_read_by_foo를 실행하십시오.


0

xargs 이것을 위해 잘 작동하는 것 같습니다 :

echo longfile.txt | xargs pv

그것은 다른 것을합니다 : pv각각 여러 번 실행 , 각각 하나 이상의 선을 그립니다 longfile.txt. 내가 여기서 쫓아 온 것은 아닙니다.
Steve Bennett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.