如何保存多个$!变成变量并在bash中使用它?

时间:2017-12-20 05:20:57

标签: bash shell

我想获得两个后台进程的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\"' 

3 个答案:

答案 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