
开了 3 个后台进程,等待这三个都结才束退出脚本:
(echo aaa >> /dev/null;sleep 10; exit 0)& (echo bbb >> /dev/null;sleep 11; exit 1)& (echo ccc >> /dev/null;sleep 9; exit 0)& for((i=0;i<3;i++)); do j=$(echo "$i+1" | bc -l) wait %$j echo $? done 这里面的 wait %$j 没搞懂...... 这个% 干嘛的? j 打印出来是 1,2,3 等待 wait %1 %2 %3 什么个意思?
1 wuwenzhx OP 大佬们都睡了吗? |
2 extreme 2018-03-17 00:18:43 +08:00 via iPhone %n n 是任务号。 执行命令时,在结尾加上&,Shell 就会把命令放到后台运行,同时返回一个任务号。 使用 Shell 内置命令 jobs 可以查看所有任务。 wait %n 就是调用系统调用 wait,同步等待任务 n 运行结束,在任务 n 运行结束后才返回。 |
3 wuwenzhx OP 多谢大佬的解答:), 之前一直是 wait $pid,没想到还能用%n 这个骚操作..... 这里如果不加% 直接 wait 1 wait2 wait3 就不行了...... 看来这个%n 表示任务号 是 shell 固定的用法 |
4 wuwenzhx OP <pre><code> 涨知识了 在脚本内加 jobs 确实能看到所有的任务 [1] Running ( echo aaa >> /dev/null; sleep 10; exit 0 ) & [2]- Running ( echo bbb >> /dev/null; sleep 11; exit 1 ) & [3]+ Running ( echo ccc >> /dev/null; sleep 9; exit 0 ) & 在终端运行 jobs 就不行了 哈哈看来我还是很菜啊~~~ <pre><code> |
5 arakashic 2018-03-17 02:05:32 +08:00 为什么不用 for((i=1;i<=3;i++)) 啊? |
6 EricXuu 2018-03-17 08:46:44 +08:00 via Android 为啥还要 bc 计算?直接 i=1 2 3 不行? |
7 lee015 2018-03-17 12:57:24 +08:00 wait 那里不要循环,前面命令加&后台运行后,最后一行这样就行了: wait $(jobs -p) |