2014-10-06 2 views
1

다른 표준 입력/bash에있는 stdin의 여러 복사본을 제공하고 싶습니다. 예 :파일 설명자 복제

for host in $hosts; do 
    exec_magic_stdin_dupe {FH} 
    ssh $host someProgram <&$FH 
done 

나는 조금 평행 GNU를 사용했습니다,하지만 난 그것을 몇 가지주의 사항이있어 정말이해야 뭔가 bash는 혼자 할 수있다 생각했습니다. 내가 찾은 유일한 방법은 이런 일이 같은 서브 쉘 교체와 함께 '티'이다이다 :

tee >(ssh $hostOne someProgram) >(ssh $hostTwo someProgram) ... > /dev/null 

하지만 내가 큰 '티'명령을 생성하는 루프의 일종을 수행하는 데있어 의미 'eval'(또는 유사)을 통해 실행하십시오.

나는 내 자신의 fifos도 관리하여이 작업을 수행 할 수 있지만 특히 바람직한 해결책은 아닙니다.

위의 모든 작업이 가능합니다. 난 그 솔루션 중 하나를 구현하기 전에 'exec_magic_stdin'을 구현하는 방법을 놓치지 않고 있는지 확인하기 만하면됩니다.

+0

단지 오타입니다. 중복입니다. – chepner

답변

2

재귀 도움이 여기에; 호스트가 없을 때까지 tee의 출력을 다음 입력으로 파이프 할 수 있습니다. recFunc에 대한 각 호출은 하나의 호스트를 "끕니다". teessh에 대한 호출과 recFunc의 다음 호출 모두에 대한 입력을 전달하며, 인수를받지 않으면 아무 작업도 수행하지 않습니다. recFunc에 대한 초기 호출은 인수로 호스트 이름 목록을 가져오고 복제 할 파일에서 표준 입력을 가져옵니다.

recFunc() { 
    if (($#)); then 
     tee >(ssh "$1" someProgram) | recFunc "${@:2}" 
    fi 
} 

hosts=(hostOne hostTwo hostThree ...) 
recFunc "${hosts[@]}" < inputfile 
+0

사실 그것은 명령 및 평가를 빌드하기 위해 루핑하는 것보다 조금 깔끔합니다. 상위 수준의 쉘에 영향을 미치는 측면에는 여전히 약간의 어려움이 있습니다 (프로세스 하위가 서브 쉘에 포함되어 나머지 부분에 영향을 줄 수는 없습니다). 그러나 나는 이것에 관해서 좀 더 구체적인 질문을해야 할 것입니다. –