获取流程ID&分配给Bash脚本中的变量

时间:2013-05-01 00:54:55

标签: bash shell unix scripting

我有一个有趣的情况。这里的所有代码都是我面临的确切问题的功能伪代码示例,因此没有关于分配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的价值?

1 个答案:

答案 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时,它没有意义。