표준 출력을 오른쪽에서 왼쪽으로 리디렉션하는 방법

표준 출력을 오른쪽에서 왼쪽으로 리디렉션하는 방법

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

./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/file표준 입력으로 cat.

이 구문은 <(echo "hello there!")명령을 실행하고 파일 설명자에 표준 출력을 추가하는 것을 의미합니다. 예를 들어 /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>

관련 정보