在linux中创建后台进程时圆括号()和大括号{}有什么区别

问题描述 投票:0回答:1

我使用

( )&
尝试了以下操作,但它没有分配我的 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
linux bash unix background-process
1个回答
0
投票

好吧,我终于弄清楚了。新子进程的数据一旦返回父进程就会被销毁。 所以解决方案是我将每个 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

© www.soinside.com 2019 - 2024. All rights reserved.