我有一个有趣的情况。这里的所有代码都是我面临的确切问题的功能伪代码示例,因此没有关于分配date
输出的笑话。我实际上想捕获更慢资源依赖函数的输出,但date
可以很好地显示我遇到的功能障碍。
我正在编写bash脚本,我希望将进程的输出分配给变量,如下所示:
RESPONSE=$(nice -n 19 date);
现在,这给了我一个很好的变量RESPONSE
,对吗?好的,如果我想获取$()
内调用的函数的进程ID怎么办?我该怎么办?我以为这会起作用:
RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
这确实为我提供了变量PID
中的进程ID,但后来我不再将输出发送到RESPONSE
。
我作为功能示例使用的代码是这样的。此示例有效,但没有PID
;是的我没有分配PID
,但这又是一个例子:
RESPONSE=$(nice -n 19 date);
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";
此示例为我提供了PID
但没有RESPONSE
:
RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";
任何人都知道如何使用RESPONSE
获取PID
的价值?
答案 0 :(得分:7)
根据您的确切设置,使用RESPONSE=$(backgroundcommand)
将等待命令完成(在这种情况下,获取其PID的时间已经太晚),或者将不会等待命令完成(在这种情况下,它的输出将不存在,并且不能将其分配给RESPONSE)。您将不得不将命令的输出存储在其他位置(如临时文件),然后在该过程完成时收集它:
responsefile=$(mktemp -t response)
nice -n 19 date >$responsefile &
pid=$!
wait $pid
response=$(<$responsefile)
rm $responsefile
(请注意,$(<$responsefile)
构造仅在bash中可用,而不是在普通posix shell中。如果不使用#!/bin/bash
启动脚本,请改用$(cat $responsefile)
。)< / p>
这仍然可能无法满足您的需求,因为(至少就我所知)您正在寻找的东西并不真正有意义。命令的PID和输出从不同时存在,因此获得两者并不是真正有意义的。我在上面给出的脚本在技术上给你们两个,但是在响应被分配时,pid是无关紧要的(过程已经存在),所以当你在最后有 pid时,它没有意义。