Linux |命令输出到变量的后台分配

Linux | Background assignment of command output to variable

我需要 3 个命令 运行 并将它们的(单行)输出分配给 3 个不同的变量,然后我用它来写入文件。在我 echo 将变量写入文件之前,我想等到所有 3 个变量赋值完成。我在 bash 脚本中 运行 循环处理这些内容。

这是我试过的 -

var1=$(longRunningCommand1) &
var2=$(longRunningCommand2) &
var3=$(longRunningCommand3) &

wait %1 %2 %3
echo "$var1,$var2,$var3">>$logFile

这根本没有为变量提供任何值。我得到 -

,,
,,
,,

但是,如果我尝试这个 -

var1=$(longRunningCommand1 &)
var2=$(longRunningCommand2 &)
var3=$(longRunningCommand3 &)

wait %1 %2 %3
echo "$var1,$var2,$var3">>$logFile

我得到了想要的输出,

o/p of longRunningCommand1, o/p of longRunningCommand2, o/p of longRunningCommand3
o/p of longRunningCommand1, o/p of longRunningCommand2, o/p of longRunningCommand3
o/p of longRunningCommand1, o/p of longRunningCommand2, o/p of longRunningCommand3

但是此 shell 脚本的 nohup.out 表明没有等待的后台作业 -

netmon.sh: line 35: wait: %1: no such job
netmon.sh: line 35: wait: %2: no such job
netmon.sh: line 35: wait: %3: no such job

我不会为此烦恼太多,但我绝对需要确保我的脚本在尝试写入之前等待分配所有 3 个变量。而 nohup.out 告诉我的不是这样!我想我想知道当我 运行 遇到这 3 个命令中的任何一个 运行 超过几秒钟的情况时,第二种方法是否正确。我还没有得到一个很长的 运行ning 命令或盒子上的资源争用来真正解决我的这个疑问。

非常感谢您提供任何有用的想法。

-公吨

您可以使用 list 和重定向来实现在 longRunningCommand1, ..2, ..3 的实际进程后台运行时编写 echo "$var1,$var2,$var3">>$logFile 的输出的目标。正如@that_other_guy 所指出的,您不能将命令替换的结果分配给后台的变量。但是,对于像 bash 那样提供 进程替换 的 shell,您可以在后台将进程的输出写入文件并将进程和重定向分开通过 ';' 将确保 command1, ..2, ..3 顺序写入日志文件,例如:

Commands that are separated by a <semicolon> ( ';' ) 
shall be executed sequentially.

POSIX Specification - lists

将这些部分放在一起,您将按顺序将评论结果写入 $logfile,并使用类似于以下内容的内容,

( (longRunningCommand1) >> $logfile; (longRunningCommand2) >> $logfile; \
  (longRunningCommand3) >> $logfile) &

(注意:写入$logfile的命令之间的';')

虽然不需要,但如果您想等到脚本中的所有命令都写入 $logfile(并且您的脚本支持 $! 作为最后一个后台进程的 PID),您可以简单地 wait $!,尽管这不是确保文件写入完成所必需的。