stdout을 오른쪽에서 왼쪽으로 리디렉션하는 방법

stdout을 오른쪽에서 왼쪽으로 리디렉션하는 방법

이것은 완벽하게 작동합니다.

./foo | ./bar

하지만 나는 다음과 같은 것을 원합니다.

./bar <| ./foo

따라서 반대 방향으로 파이프하여 명령줄에서 foo의 인수를 더 빠르게 변경할 수 있습니다.

파이프는 실시간이어야 합니다. 내 foo프로그램은 절대 반환되지 않습니다.

이것이 가능한가 ?

답변1

간단하고 적절한 방법은 foobar 함수를 정의하는 것입니다.

foobar () { ./foo "$@" | ./bar ; }

(필요에 따라 명령줄에서 또는 예를 들어 ".bashrc"와 같은 일부 시작 스크립트에서) 그런 다음 언제든지 다음을 수행하십시오.

foobar "this"  that   "and this also"

그럴 것이다

./foo  this   that   "and this also" | ./bar

답변2

./bar < <( ./foo )

예를 들어:cat < <(echo "hello there!")

작동 방식을 이해하려면 스크립트의 일부를 별도로 고려하십시오.

이 구문은 cat < /path/to/file파일을 읽고 /path/to/filestdin으로 cat.

이 구문은 <(echo "hello there!")명령을 실행하고 stdout을 /dev/fd/65. 전체 표현식의 결과는 와 같은 텍스트 /dev/fd/65이며 명령은 병렬로 실행되어 해당 파일 설명자를 제공합니다.

이제 결합된 스크립트는 오른쪽 명령을 실행하고 이를 파일 설명자로 파이프한 다음 해당 파일 설명자를 왼쪽 명령에 대한 표준 입력으로 변환하고 왼쪽 명령을 실행합니다.

내가 아는 오버헤드는 없습니다. a | b구문 설탕만 있으면 와 정확히 동일합니다.

답변3

명명된 파이프를 사용하면 다음과 같은 작업을 수행할 수 있을 것 같습니다.

mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f  some_input_file 
rm $mypipe

또는 명령의 변경되지 않는 부분을 쉘 스크립트에 넣으십시오.

./foo "$@" | ./bar

foo스크립트 명령줄에 인수를 제공합니다 .

./myscript <args to foo>

관련 정보