为什么在第一次迭代后停止?

时间:2014-08-29 22:08:37

标签: linux bash ssh

如果我执行以下操作

tr -cd 'a-z' < /dev/urandom | fold -w10 | head -n40 > pw
for f in $(seq -w 40); do echo linux$f.example.com;done > hosts

while read -r x && read -r y <&3; do ssh $x -l root echo $y;done <hosts 3<pw 

然后循环在第一次迭代后停止,但是如果我插入echo(这不是我想要的),那么它将循环遍历所有40。

while read -r x && read -r y <&3; do echo ssh $x -l root echo $y;done <hosts 3<pw 

问题

如何在不先创建临时文件的情况下让它执行所有40次迭代?

2 个答案:

答案 0 :(得分:1)

如何避免临时文件...

#!/bin/bash
h=1
LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10 | head -n40 | \
   while read x; do
      host=$(printf "linux%02d.example.com" $h)
      echo $x $host
      ((h++))
   done

避免临时文件的另一种方法是使用进程替换来生成所需的两个输入,然后将它们成对地粘贴到单独的行上,然后在单个循环中读取它们,如下所示:

#!/bin/bash
paste \
   <(LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10)        \
   <(for f in $(seq -w 40); do echo linux$f.example.com;done) |   \
   head -n40 | while read x y; do
      echo $x $y
   done

如果你担心子壳内的变量,你可以反过来做到这一点:

#!/bin/bash
while read x y; do
   echo $x $y
done < <( paste \
           <(LC_CTYPE="C" tr -cd 'a-z' < /dev/urandom | fold -w10)        \
           <(for f in $(seq -w 40); do echo linux$f.example.com;done) |   \
           head -n40)

答案 1 :(得分:1)

这似乎ssh正在看到并消耗你的fds。

运行时将fds关闭到ssh