如何保存多个$!转换为变量,然后在bash中使用它?

如何保存多个$!转换为变量,然后在bash中使用它?,bash,shell,Bash,Shell,我想得到两个后台进程的PID sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo "pid1: $pid1, pid2: $pid2" 并获得如下输出: [1] 124646 [2] 124648 pid1: $!, pid2: $! sh -c "sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"" 我希望得到的输出如下

我想得到两个后台进程的PID

sleep 20 & pid1=$\!; sleep 10 & pid2=$\!; echo "pid1: $pid1, pid2: $pid2"
并获得如下输出:

[1] 124646
[2] 124648
pid1: $!, pid2: $!
sh -c "sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\""
我希望得到的输出如下:

pid1: 124646, pid2: 124648
有人知道原因并能帮助实现这一点吗

[添加2018/01/02]

很抱歉响应太晚,一方面很忙,另一方面我想验证脚本

我想要运行的实际脚本如下所示:

[1] 124646
[2] 124648
pid1: $!, pid2: $!
sh -c "sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\""
它将报告
bash:!:未找到事件
,因此我尝试添加\并成为:

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\"' 

在过去,我通过使用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

在过去,我通过使用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

反斜杠导致值为字符串
$逐字记录。作业中不要加反斜杠

在命令行上,您可能希望临时
设置+H
,以避免获得
未找到事件
警告;但这只会影响交互式shell。在脚本中,
set-H
永远不会处于活动状态(并且无论如何都没有意义)


(我推测这就是你将反斜杠放在那里的原因。如果没有,只需将其去掉即可。)

反斜杠导致值成为字符串
$逐字记录。作业中不要加反斜杠

在命令行上,您可能希望临时
设置+H
,以避免获得
未找到事件
警告;但这只会影响交互式shell。在脚本中,
set-H
永远不会处于活动状态(并且无论如何都没有意义)


(我猜这就是你把反斜杠放在第一位的原因。如果没有,就把它去掉。)

你的语法不正确,请尝试以下方法:

[root@XXX ~]# sleep 5 & pid1=$!; sleep 6 & pid2=$!; echo "pid1: ${pid1}, pid2: ${pid2}"
[1] 2308
[2] 2309
pid1: 2308, pid2: 2309

您的语法不正确,请尝试以下操作:

[root@XXX ~]# sleep 5 & pid1=$!; sleep 6 & pid2=$!; echo "pid1: ${pid1}, pid2: ${pid2}"
[1] 2308
[2] 2309
pid1: 2308, pid2: 2309

sleep 20&pid1=$!;睡眠10&pid2=$!;echo“pid1:$pid1,pid2:$pid2
(不要逃避感叹号)
sleep 20&pid1=$!;sleep 10&pid2=$!;echo“pid1:$pid1,pid2:$pid2
(不要逃避感叹号)实际上,我建议您在
.bashrc
中使用
set+H
作为永久设置,除非您真正理解
事件未找到
警告的含义,并且正在积极使用此功能。感谢您的回复,您能再看一看如何制作脚本
sh-c吗“echo$name;睡眠20&pid1=$!;睡眠10&pid2=$!;echo \“pid1:$pid1,pid2:$pid2\”
runnable?您是否有理由不按照
set+H
的建议至少暂时禁用“未找到事件”“有问题吗?另外,更新你的问题以满足新的需求不是很好的形式;你可能应该在这里接受其中一个答案,然后发布一个新的问题,重点更明确。谢谢你的建议。我将为后面的问题发布另一个问题。至于不使用
set+H
的原因,我可以很好地消除
事件未找到
警告,谢谢。这就是它的作用!实际上,我建议您在
.bashrc
中使用
set+H
作为永久设置,除非您真正理解
事件未找到
警告的含义,并且正在积极使用此功能。感谢您的回复,您能再看看如何制作脚本
sh-c吗“echo$name;睡眠20&pid1=$!;睡眠10&pid2=$!;echo \“pid1:$pid1,pid2:$pid2\”
runnable?您是否有理由不按照
set+H
的建议至少暂时禁用“未找到事件”“有问题吗?另外,更新你的问题以满足新的需求不是很好的形式;你可能应该在这里接受其中一个答案,然后发布一个新的问题,重点更明确。谢谢你的建议。我将为后面的问题发布另一个问题。至于不使用
set+H
的原因,我可以很好地消除
事件未找到
警告,谢谢。这就是它的作用!如果我真的想使用
sh-c“sleep 20&pid1=$!;sleep 10&pid2=$!;echo\“pid1:$pid1,pid2:$pid2\”
如何编写脚本,您能提供帮助吗?谢谢如果我真的想使用
sh-c“sleep 20&pid1=$!;sleep 10&pid2=$!;echo\“pid1:$pid1,pid2:$pid2\”
如何编写脚本,您能提供帮助吗?谢谢