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