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

Linux 为什么这会在第一次迭代后停止?,linux,bash,ssh,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 问题 如何让它执行所有4

如果我这样做

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 
问题


如何让它执行所有40次迭代,而不首先生成临时文件?

如何避免临时文件

#!/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
h=1
LC_CTYPE=“C”tr-cd‘a-z’
避免临时文件的另一种方法是使用进程替换生成所需的两个输入,然后将它们成对粘贴到单独的行上,然后在单个循环中读取这两个输入,如下所示:

#!/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
粘贴\

这似乎是
ssh
正在查看并耗尽您的FD


运行fds时,请将其关闭到
ssh

可能会告诉我们它应该做什么,因为它不工作!我想知道
ssh
是否正在窃取您的FD并读取/刷新它们。尝试关闭stdin和
ssh
命令的
&3
。@EtanReisner添加
/dev/null
解决了问题。thank=)使用管道所隐含的子shell使
h
计数器无法正常工作。@EtanReisner好的,谢谢。我会在早上检查-虽然我在Mac上运行了它,而且它似乎是正确的。@EtanReisner它在我的机器上运行得很好。只涉及一个子shell,它处理
while
循环。它在启动时从其父级继承
h
,然后在每次循环中愉快地递增。我看不出有什么问题-你能解释一下你的意思吗?啊,我很抱歉,我错过了
h
仅在这种情况下由子壳使用,而不是通过各种子壳。(我认为,尽管该管道中实际上有三到四个子壳,但管道的每一部分都有一个子壳,尽管可能至少有一个部分不使用当前的壳。)
#!/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)