我使用
( )&
尝试了以下操作,但它没有分配我的 IP 地址,而且看起来 wait
语句不会等待。相同的代码无需 ( )&
即可工作。并行执行这个 ( )&
代码块还有什么其他可能的方法?如果我改用花括号会发生什么?
为了简单起见
iface[i] 是 eth0,eth1,eth2,eth3 等
nic_count 是 eth 端口数。
最初所有 ip_addr[i]=0 都被分配。
i=0
while ((i < Snic_count )); do
if [[ ${#ip_addr[$i]} == 0 ]]; then
(
dhclient ${iface[$i]};
sleep 10
ip_addr[$i]=`ip 4 -a show ${iface[$i]} | awk '/inet/ {gsub("/..$","",$2); print $2}'`
if [[ ${#ip_addr[$i]} == 0 ]]; then
echo -e "Unable to assign an IP address for ${iface[$i]}"
fi
)&
fi
1+=1
done
wait
好吧,我终于弄清楚了。新子进程的数据一旦返回父进程就会被销毁。 所以解决方案是我将每个 IP 地址写入外部文件,例如...(
echo ip_addr[$i] > ip_num$i
)
无论如何,如果有人能想出一个避免创建过多文件的想法,我们将不胜感激。
while ((i < Snic_count )); do
if [[ ${#ip_addr[$i]} == 0 ]]; then
(
dhclient ${iface[$i]};
sleep 10
ip_addr[$i]=`ip 4 -a show ${iface[$i]} | awk '/inet/ {gsub("/..$","",$2); print $2}'`
if [[ ${#ip_addr[$i]} == 0 ]]; then
echo -e "Unable to assign an IP address for ${iface[$i]}"
fi
#save each output ip to a separate file.
echo ip_addr[$i] > ip_num$i
)&
fi
1+=1
done
wait