
이것은 완벽하게 작동합니다.
./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
stdin으로 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>