在后台从Bash脚本启动进程,然后将其带到前台

时间:2019-05-14 10:48:11

标签: bash job-control

以下是我拥有的某些代码的简化版本:

#!/bin/bash

myfile=file.txt
interactive_command > $myfile &
pid=$!

# Use tail to wait for the file to be populated
while read -r line; do
  first_output_line=$line
  break # we only need the first line
done < <(tail -f $file)
rm $file

# do stuff with $first_output_line and $pid
# ...
# bring `interactive_command` to foreground?

我想将interactive_command的第一行输出存储到变量后,使其成为前台,以便用户可以通过调用此脚本与之交互。

但是,似乎无法在脚本的上下文中使用fg %1,并且不能将fg与PID一起使用。有办法可以做到吗?

(此外,是否有一种更优雅的方式来捕获输出的第一行,而无需写入临时文件?)

1 个答案:

答案 0 :(得分:1)

使用fgbg的作业控制仅在交互式外壳程序上可用(即,在终端中键入命令时)。通常,shell脚本在非交互式shell中运行(这也是默认情况下别名在shell脚本中不起作用的原因)

由于您已经将PID存储在变量中,因此,使进程处于前台状态与等待进程相同(请参见Job Control Builtins)。例如,您可以做

wait "$pid"

您还拥有coproc bash built-in的基本版本,该版本可让您获取从后台命令捕获的标准输出消息。它公开了存储在数组中的两个文件描述符,使用它们可以读取stdout的输出或将输入馈送到其stdin

coproc fdPair interactive_command 

语法通常为coproc <array-name> <cmd-to-bckgd>。该数组由内置的文件描述符ID填充。如果未显式使用任何变量,则将其填充在COPROC变量下。因此您的要求可以写为

coproc fdPair interactive_command 
IFS= read -r -u "${fdPair[0]}" firstLine
printf '%s\n' "$firstLine"