{} &后台执行时,如何将变量值传递出来
Tofloor
poster avatar
乐阿兰那
deepin
2020-04-30 20:18
Author
本帖最后由 zhangweildlh01 于 2020-4-30 13:03 编辑

如题,将或脚本中一段命令(比如for...do...done) 以{} &放入后台执行,同时采用((j++))的方式统计运行次数。
结果发现{} &后,echo $j 为空,$j的值无法传递出来
求高手指点


***{ for...do...done;}  $j的值可以传递出来!但 { for...do...done;} &  后 $j的值就传递不出来了
Reply Favorite View the author
All Replies
avatar
走钢丝
deepin
2020-04-30 20:36
#1
问题是你的脚本是不是每次都重新运行吧。如果每次都重新运行,一退出内存变量肯定都清空了。另外脚本应该无法访问内核对象吧?估计只能写文件了。
——以上纯属猜测
Reply View the author
avatar
乐阿兰那
deepin
2020-04-30 21:03
#2
https://bbs.deepin.org/post/193351
问题是你的脚本是不是每次都重新运行吧。如果每次都重新运行,一退出内存变量肯定都清空了。另外脚本应该无 ...

对不起,我描述得不清楚。修改编辑一下

如题,将或脚本中一段命令(比如for...do...done) 以{} &放入后台执行,同时采用((j++))的方式统计运行次数。
结果发现{} &后,echo $j 为空,$j的值无法传递出来

***{ for...do...done;}  $j的值可以传递出来!但 { for...do...done;} &  后 $j的值就传递不出来了
Reply View the author
avatar
走钢丝
deepin
2020-04-30 21:17
#3
搜索了一下,据说异步执行的话,标准输出会被重定向到 /dev/null,最好自己指定重定向
Reply View the author
avatar
乐阿兰那
deepin
2020-04-30 21:31
#4
本帖最后由 zhangweildlh01 于 2020-4-30 14:36 编辑

实际情况比这个复杂;采用了三层for 循环镶套
1、多个命令集需要丢入后台;
2、具体丢入后台的命令集数量不可预见(不多,有时9个,有时11个,有时15个...);
3、每个命令集在后台执行的时长不可预见(就是每次执行耗时);
因此建一堆文件,用于各个命令集$j值的写入;最后批量读取,全部相加
太繁琐,效率太低
Reply View the author
avatar
走钢丝
deepin
2020-05-01 21:47
#5
https://bbs.deepin.org/post/193351
实际情况比这个复杂;采用了三层for 循环镶套
1、多个命令集需要丢入后台;
2、具体丢入后台的命令集数量不 ...

值应该是在的啊,只是标准输出默认被限制了,自己重定向到 /dev/stdout 即可吧。
Reply View the author
avatar
乐阿兰那
deepin
2020-05-07 17:49
#6
https://bbs.deepin.org/post/193351
值应该是在的啊,只是标准输出默认被限制了,自己重定向到 /dev/stdout 即可吧。 ...

是这样的吗

for adzw_3 in `cat /data/media/0/adzw_3.txt`
do
  { for adzw_30 in `find /data/media/0 -type d -iname "$adzw_3" 2>/dev/null`;do
    echo $adzw_30/*>/dev/null;
    ((num++));
    echo $num >/dev/stdout;
  done;} &
done
echo num=$num

不得行!!!!
Reply View the author
avatar
ghostry
deepin
2020-05-07 18:46
#7
https://bbs.deepin.org/post/193351
是这样的吗

for adzw_3 in `cat /data/media/0/adzw_3.txt`

看着是因为不阻塞导致的.

& 不阻塞,然后后面取值时候很可能还没算出值.
Reply View the author
avatar
listenerri
deepin
2020-05-07 22:11
#8
https://bbs.deepin.org/post/193351
看着是因为不阻塞导致的.

& 不阻塞,然后后面取值时候很可能还没算出值. ...

正解,楼主该不会是认为把操作放入后台运行就不需要消耗时间计算了吧
其实这也是个线程/进程间同步的问题,父线程/进程需要等待子线程/进程的处理结果
Reply View the author
avatar
乐阿兰那
deepin
2020-05-08 01:15
#9
在最后一个done的后面加上wait;等待所有子线程结束,一样不得行。一旦放入后台,哪怕所有线程结束,也无法读取到变量值(变量值为空)。问题已经解决了,代码如下;谢谢大家了喔:

for adzw_3 in `cat /data/media/0/adzw_3.txt`
do
((i++))
  { for adzw_30 in `find /data/media/0 -type d -iname "$adzw_3" 2>/dev/null`;do
    echo $adzw_30/*>/dev/null;
    ((num_$i++));
  done;
    eval echo '$'"num_$i" >>1.txt;} &
done
Reply View the author