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

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

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

为了使问题变得简单,我只是删除qazxsw poi,而这使它成为一个完全不同的问题。

对于我的问题,我发现下面的脚本会起作用:

sh -c

还有另一个问题,如何使下面的脚本工作:

sh -c 'sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo "pid1: $pid1, pid2: $pid2"'
bash shell
3个回答
3
投票

反斜杠导致该值为字符串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\"' 逐字。不要在作业中加上反斜杠。

在命令行上,你可能想暂时$!,以避免获得set +H警告;但这只会影响交互式shell。在一个脚本中,event not found永远不会活跃(无论如何都会毫无意义)。

(我猜测这就是你首先把反斜杠放在那里的原因。如果不是,就把它拿出去。)


1
投票

你的语法不正确,试试这个:

set -H

0
投票

我过去通过使用bash数组来保存PID来实现这一点。我有一系列数据库导入要运行,当顺序处理时,他们需要大约8个小时才能完成。我将它们全部作为后台进程启动,并跟踪PID列表以观察完成情况,并将处理时间缩短至45分钟。

下面是启动后台进程,将PID存储在数组中,然后打印所有数组值的示例:

[root@XXX ~]# sleep 5 & pid1=$!; sleep 6 & pid2=$!; echo "pid1: ${pid1}, pid2: ${pid2}"
[1] 2308
[2] 2309
pid1: 2308, pid2: 2309
© www.soinside.com 2019 - 2024. All rights reserved.