我想获得两个后台进程的pid,
sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo "pid1: $pid1, pid2: $pid2"
并获得如下输出:
[1] 124646
[2] 124648
pid1: $!, pid2: $!
我希望获得的输出如下:
pid1: 124646, pid2: 124648
任何人都知道为什么并且可以帮助实现这一目标?
[add 2018/01/02]
对于非常迟到的回复感到抱歉,一方面很忙,另一方面是我要验证脚本。
我想要运行的实际脚本如下所示:
sh -c "sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\""
因为它会报告bash: !: event not found
,所以我尝试添加\并成为:
sh -c "sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo \"pid1: $pid1, pid2: $pid2\""
为了使问题变得简单,我只需要sh -c
,这会使问题变成一个完全不同的问题。
对于我的问题,我发现下面的脚本会起作用:
sh -c 'sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo "pid1: $pid1, pid2: $pid2"'
然而还有另一个问题,如何使下面的脚本工作:
name='bob'
# below script reports 'bash: !: event not found' error
sh -c "echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\""
# below script $name will not become bob
sh -c 'echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"'
答案 0 :(得分:3)
反斜杠导致值为字符串$!
逐字。不要在作业中加上反斜杠。
在命令行中,您可能希望暂时set +H
以避免收到event not found
警告;但这只会影响交互式shell。在脚本中,set -H
永远不会激活(无论如何都会毫无意义)。
(我猜测这就是你把反斜杠放在首位的原因。如果没有,只需把它取出来。)
答案 1 :(得分:1)
您的语法不正确,请尝试以下方法:
d[, roll_sum_3d := d[d[, .(customer, date, date2 = date %m+% days(3), revenue)]
, on = .(customer, date > date, date <= date2)
, sum(revenue, na.rm = TRUE), by=.EACHI]$V1][]
答案 2 :(得分:0)
我过去通过使用bash数组来保存PID来实现这一点。我有一系列数据库导入要运行,当顺序处理时,他们需要大约8个小时才能完成。我将它们全部作为后台进程启动,并跟踪PID列表以观察完成情况,并将处理时间缩短至45分钟。
以下是启动后台进程,将PID存储在数组中,然后打印所有数组值的示例:
$ pids=()
$ sleep 20 &
22991
$ pids+=($!)
$ sleep 20 &
23298
$ pids+=($!)
$ j=0;for i in "${pids[@]}";do ((j=j+1));echo 'pid'$j': '$i;done
pid1: 22991
pid2: 23298