我想在bash中将stdin的多个副本提供给不同的stdins / FDs。 例如:
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
但这意味着我必须执行某种循环来创建一个大的'tee'命令,然后通过'eval'(或类似的)执行它。
我也可以通过管理自己的fifos来做到这一点,但这也不是特别优选的解决方案。
以上所有都可以。我只想验证在实现其中一个解决方案之前,我没有错过某种实现'exec_magic_stdin'的方法。
答案 0 :(得分:2)
递归有助于此;您可以将一个tee
的输出传输到下一个的输入中,直到您没有主机为止。每次拨打recFunc
都会“剥离”一个主机。 tee
将其输入传递给对ssh
的调用以及recFunc
的下一次调用,如果它没有收到任何参数则不会执行任何操作。对recFunc
的初始调用获取主机名列表作为参数及其要复制的文件的标准输入。
recFunc () {
if (( $# )); then
tee >(ssh "$1" someProgram) | recFunc "${@:2}"
fi
}
hosts=(hostOne hostTwo hostThree ... )
recFunc "${hosts[@]}" < inputfile