获取进程ID并在Bash脚本中分配变量

Jak*_*uld -2 unix bash shell scripting

我有一个有趣的情况.这里的所有代码都是我所面临的确切问题的功能伪代码示例,所以没有关于分配输出的笑话date.我实际上想要捕获更慢的更依赖资源的函数的输出,但是能够date很好地显示我遇到的功能障碍.

我正在编写bash脚本,我想将进程的输出分配给变量,如下所示:

RESPONSE=$(nice -n 19 date);
Run Code Online (Sandbox Code Playgroud)

现在,这给了我RESPONSE一个很好的变量,对吗?好的,如果我想获取在其中调用的函数的进程ID $()怎么办?我该怎么办?我以为这会起作用:

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
Run Code Online (Sandbox Code Playgroud)

这确实给了我变量中的进程ID PID,但后来我不再获得发送的输出RESPONSE.

我作为功能示例使用的代码是这样的.这个例子有效,但没有PID; 是的我不是分配一个PID但是这是一个例子:

RESPONSE=$(nice -n 19 date);
wait ${PID};
echo "${RESPONSE}";
echo "${PID}"; 
Run Code Online (Sandbox Code Playgroud)

这个例子给了我一个PID但没有RESPONSE:

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";
Run Code Online (Sandbox Code Playgroud)

任何人都知道我如何能够获得RESPONSE与之相关的价值PID

Gor*_*son 7

根据您的确切设置,使用RESPONSE=$(backgroundcommand)将等待命令完成(在这种情况下,获取其PID为时已太晚),或者等待命令完成(在这种情况下,它的输出不会现在还存在,这不能分配给RESPONSE).您将不得不将命令的输出存储在其他位置(如临时文件),然后在进程完成时收集它:

responsefile=$(mktemp -t response)
nice -n 19 date >$responsefile &
pid=$!
wait $pid
response=$(<$responsefile)
rm $responsefile
Run Code Online (Sandbox Code Playgroud)

(请注意,该$(<$responsefile)构造仅在bash中可用,而不是在普通的posix shell中.如果不启动脚本#!/bin/bash,请$(cat $responsefile)改用.)

这仍然可能无法满足您的需求,因为(至少就我所知)您正在寻找的东西并不真正有意义.命令的PID和输出从不同时存在,因此获得两者并不是真正有意义的.我在上面给出的脚本在技术上给你们两个,但是在响应被分配时,pid是无关紧要的(过程已经存在),所以当你在最后 pid时,它是没有意义的.