2014-10-06 3 views
1

Я хочу передать несколько копий stdin в разные stdins/FDs в bash. Пример:Дупликация дескриптора файла

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

Я использовал GNU параллельно немного, но у меня есть некоторые оговорки с ним и на самом деле думал, что это должно быть что-то баш может сделать в одиночку. Единственный способ я нашел, что это что-то вроде этого является «тройник» с ним подоболочка замены, как:

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

Но это означает, что я должен выполнить какую-то петлю, создавая команду большой «Tee» а затем выполнить его через «eval» (или аналогичный).

Я мог бы это сделать, управляя своими собственными фифами, но это не особенно предпочтительное решение.

Все вышесказанное может работать. Я просто хочу проверить, что я не пропустил какой-либо способ реализовать «exec_magic_stdin» перед тем, как реализовать одно из этих решений.

+0

Это просто опечатка: дублирование. – chepner

ответ

2

Рекурсия помогает здесь; вы можете вывести вывод одного tee на вход следующего, пока вы не выйдете из хостов. Каждый вызов recFunc «отключает» один хост. tee передает свой вход как на вызов ssh, так и на следующий вызов recFunc, который ничего не делает, если он не принимает никаких аргументов. Первоначальный вызов recFunc получает список имен хостов в качестве аргументов и его стандартный ввод из файла, который вы хотите дублировать.

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

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

Это действительно немного чище, чем цикл, чтобы построить команду и eval. Там все еще есть некоторые трудности с аспектом влияния на оболочку более высокого уровня (часть причины, которую я не смог включить, - это процесс, который вводит меня в подоболочку, и я не могу повлиять на остальное оттуда). Но я должен, вероятно, следить за этим с более конкретным вопросом об этом. –

Смежные вопросы