입력(다중 FIFO)을 기반으로 동적 프로세스 교체를 생성하는 방법은 무엇입니까?

입력(다중 FIFO)을 기반으로 동적 프로세스 교체를 생성하는 방법은 무엇입니까?

다른 명령의 출력을 기반으로 여러 프로세스 교체를 생성하려고 하는데 이를 수행하는 방법을 잘 모르겠습니다.

예제 시나리오로 다음과 같은 파일 목록을 제공했습니다.

touch a.txt b.txt c.txt d.doc e.doc f.pdf g.pdf h.xls i.xls

나는 일을 해요사용 가능한 파일 확장자 목록:

ls -1 *.* | awk -F. '{if (NF>1) {print $NF}}' | sort | uniq

그런 다음 동적 목록을 기반으로 다음과 같은 FIFO를 생성하려고 합니다. 예를 들면 다음과 같습니다.

pr -mt <(ls -1 *.doc) <(ls -1 *.pdf) <(ls -1 *.txt) <(ls -1 *.xls)

이렇게 하면 각 그룹을 다른 열에 인쇄할 수 있습니다. 그러나 위의 FIFO 목록은 하드코딩되어 있으므로 내 목표는 동적 명령 수(예: 와일드카드, using 등)를 대체할 수 있는 방법을 찾는 것 eval입니다 xargs.

또 다른 상황은 다음에서 설명됩니다.여기.

위의 문제에 대한 구체적인 해결책(해결 방법)에는 관심이 없습니다. 이는 단지 하나의 상황일 뿐이기 때문입니다. 나는 셸에서 프로세스 교체를 동적으로 생성하는 방법이나 이를 달성하기 위해 사용할 수 있는 다른 도구에 관심이 있습니다.

또한보십시오:익명 FIFO를 생성하는 방법은 무엇입니까?

답변1

문자열을 동적으로 작성하고 평가하는 것은 쉽습니다.

eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list  |tr '\n' ' ' )"

명령을 빌드하려는 확장 목록을 나타내는 list파일(아마도 fifo)입니다 .

<()기본적으로 이름이 지정되지 않은 FIFO를 생성합니다. 평가가 필요 없는 대안은 다음과 같은 이름을 사용하는 것입니다.

while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe  #remove the named pipes when done

위의 내용은 디렉터리에 ".pipe"로 끝나는 다른 파일 이름이 없다고 가정합니다.

관련 정보