文件描述符重复

时间:2014-10-06 00:26:15

标签: bash fifo tee

我想在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'的方法。

1 个答案:

答案 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