如果我执行以下操作
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次迭代?
答案 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
。