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)