2014-10-06 140 views
1

我想在bash中将stdin的多个副本提供给不同的stdins/FD。 例子:文件描述符的重复

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 2014-10-06 00:38:01

回答

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更清洁一点。在影响更高层shell的方面仍然存在一些困难(部分原因是我没有包括process sub将我放在一个子shell中,而我不能从那里影响其余部分)。但我可能应该就此提出一个更具体的问题。 – 2014-10-06 17:44:03