Bash: 명령 대체를 사용하는 붙여넣기 명령과 FIFO FD의 차이점

Bash: 명령 대체를 사용하는 붙여넣기 명령과 FIFO FD의 차이점

붙여넣기 명령에 여러 FIFO FD를 사용할 때 "깨진 파이프" 상황이 발생하는 이유를 이해하려고 노력하고 있지만 명령 대체를 사용하면 모든 것이 괜찮습니다.

약간의 배경 지식: 상당히 큰 배열을 처리하고, 특정 값을 찾고, 최종적으로 사용자가 원할 수 있는 일련의 작업을 완료해야 합니다. 이 대규모 데이터 세트의 경우 속도가 매우 중요합니다. 지금까지 제가 생각한 것은 단순히 배열(아래 첨자와 값이 모두 사용자 작업에서 사용될 것이기 때문에 병렬로)을 인쇄하고, 각 배열 항목이 처리될 수 있도록 서로 붙여두는 것입니다. "사용자는 주로 파이프라인(사용자 작업)에 의해 승인됩니다.

그러나 첫 번째 열(배열 아래 첨자)에 대한 붙여넣기 명령이 성공하지 못한 것으로 나타났습니다.

다음은 매우 단순화된 명령 예입니다(create_tmp_fifo는 매우 간단한 작업을 수행합니다. 파이프의 "cat"은 사용자 작업의 추상적인 예일 뿐입니다).

fifo_pasteOutput=$(create_tmp_fifo) fifo_subscriptPrint=$(create_tmp_fifo) fifo_valuePrint=$(create_tmp_fifo);
printf '%s\n' "${!DATA_SET[@]}" >$fifo_subscriptPrint &
printf '%s\n' "${DATA_SET[@]}" >$fifo_valuePrint &
paste -d'|' <$fifo_subscriptPrint <$fifo_valuePrint | cat;
printf '\n';
rm $fifo_subscriptPrint $fifo_valuePrint $fifo_pasteOutput

산출:

[1] 117250
[2] 117251
#0,SYS[offset=0,ceiling=10]
#1,MSG[offset=11,ceiling=20]
#2,MISC[offset=21,ceiling=50]
[1]-  Broken pipe             printf '%s\n' "${!DATA_SET[@]}" > $fifo_subscriptPrint
[2]+  Done                    printf '%s\n' "${DATA_SET[@]}" > $fifo_valuePrint

첫 번째 프로세스에 "깨진 파이프"가 표시되는 이유는 무엇입니까? 만약 내가한다면:

paste -d'|' <(printf '%s\n' "${!DATA_SET[@]}") <(printf '%s\n' "${DATA_SET[@]}")

모든 것이 예상대로 작동합니다. Bash 매뉴얼을 읽으면서 프로세스 대체는 기본적으로 지정된 FIFO 파일에서 수행하는 작업과 동일하다는 것을 이해했습니다. 제가 뭔가 잘못 이해한 걸까요? 혼란스러워요.

사용자 사용을 위해 배열을 인쇄하는 기능은 다양한 방법으로 출력 형식을 지정하는 다양한 옵션을 사용하므로 붙여넣기 명령에서 프로세스 대체를 피하는 것이 좋습니다. 따라서 붙여넣기 명령의 다양한 변형 수를 각각 줄이려고 노력하고 있습니다.

어떤 통찰력이라도 미리 감사드립니다.

답변1

내 자신이 멍청하게 느껴진다. 이미 답을 찾았습니다.

paste -d'|' $fifo_subscriptPrint $fifo_valuePrint

마지막으로 명령을 살펴보면서 인수가 파일 자체인지 궁금합니다. 어쨌든, 시간 내주셔서 모두 감사드립니다.

관련 정보