Linux 将'jobs-p'的输出捕获到变量中
我正在使用Linux 将'jobs-p'的输出捕获到变量中,linux,bash,shell,Linux,Bash,Shell,我正在使用shell尝试捕获后台作业列表: sleep 11 | tee log_1.txt & sleep 12 | tee log_2.txt & jobs -p # this returns PIDs X=$(jobs -p) echo ${X} 然后我这样开始:sh./script.sh 但由于某种原因,我什么也得不到 试图调试它时,我看到jobs-p实际上返回了项目列表 类似于X=$(ls-al)的功能也可以按预期工作,并且内容被捕获。您的代码在bash中工作正常
shell
尝试捕获后台作业列表:
sleep 11 | tee log_1.txt &
sleep 12 | tee log_2.txt &
jobs -p # this returns PIDs
X=$(jobs -p)
echo ${X}
然后我这样开始:sh./script.sh
但由于某种原因,我什么也得不到
试图调试它时,我看到jobs-p
实际上返回了项目列表
类似于
X=$(ls-al)
的功能也可以按预期工作,并且内容被捕获。您的代码在bash
中工作正常:
$ bash myfile
10715
10717
10715 10717
$
但是它在破折号中确实失败了,这可能就是您的sh
的功能:
$ dash myfile
11048
11046
$
(见附件)
dash
有权这样做(Bash可能是错误的),因为“作业实用程序将显示在当前shell环境中启动的作业的状态”,并且您已经通过使用subshell$(…)
创建了一个新的shell环境
如果您想以兼容的方式执行此操作,可以重定向到临时文件并读取该文件。或者,您可以使用$收集每个已启动后台作业的PID代码>您的代码在bash
中运行良好:
$ bash myfile
10715
10717
10715 10717
$
但是它在破折号中确实失败了,这可能就是您的sh
的功能:
$ dash myfile
11048
11046
$
(见附件)
dash
有权这样做(Bash可能是错误的),因为“作业实用程序将显示在当前shell环境中启动的作业的状态”,并且您已经通过使用subshell$(…)
创建了一个新的shell环境
如果您想以兼容的方式执行此操作,可以重定向到临时文件并读取该文件。或者,您可以使用$收集每个已启动后台作业的PID
您标记了这个bash
,但是您使用sh
运行它。它是哪一个?可能是它的复制品。简短的回答是,用反勾号。@另一个人,是的,对不起,也许我不应该这样做,但我担心这个问题不会得到足够的关注。您是对的,它是/bin/dash
@jww,谢谢您的参考,但是由于某些原因,反勾号不适用于作业-p
,类似于ls-al
的东西可以工作,但不适用于作业
。我想知道这个命令有什么特别之处。jobs
是一个内部命令(没有子流程知道shell提供的进程列表以及进程组负责人的状态),因此它是特定于您使用的shell的。曾经说过,对于jobs-p
命令,您可以期望不同的shell有不同的行为。您标记了这个bash
,但是您使用sh
运行它。它是哪一个?可能是它的复制品。简短的回答是,用反勾号。@另一个人,是的,对不起,也许我不应该这样做,但我担心这个问题不会得到足够的关注。您是对的,它是/bin/dash
@jww,谢谢您的参考,但是由于某些原因,反勾号不适用于作业-p
,类似于ls-al
的东西可以工作,但不适用于作业
。我想知道这个命令有什么特别之处。jobs
是一个内部命令(没有子流程知道shell提供的进程列表以及进程组负责人的状态),因此它是特定于您使用的shell的。曾经说过,对于jobs-p
命令,不同的shell可能会有不同的行为。谢谢你的回答,我认为重定向到文件就可以了。虽然我改用了bash
,但我在Linux脚本编写方面没有太多经验,很多事情让我困惑,也许在写这篇文章之前我应该考虑一下两者之间的区别:)无论如何,我最终得到了这样的代码(\是下一行):我的应用程序| tee my.log&\read-一个我无法使用$的进程代码>直接,因为我通过管道连接到tee
我会得到tee的PID。我还应该提到,我需要在后台启动两个应用程序。我考虑过的一个选项是使用2>&1>my.log
和下面的tail-f my.log&
来代替|tee…
,但这太麻烦了,因为我需要做两次,然后再杀死两个进程。此外,POSIX也没有强制使用作业控制。作为可选选项,任何供应商都可以自由包含作业控制或不包含作业控制。谢谢您的回答,我认为重定向到文件就可以了。虽然我改用了bash
,但我在Linux脚本编写方面没有太多经验,很多事情让我困惑,也许在写这篇文章之前我应该考虑一下两者之间的区别:)无论如何,我最终得到了这样的代码(\是下一行):我的应用程序| tee my.log&\read-一个我无法使用$的进程代码>直接,因为我通过管道连接到tee
我会得到tee的PID。我还应该提到,我需要在后台启动两个应用程序。我考虑过的一个选项是使用2>&1>my.log
和下面的tail-f my.log&
来代替|tee…
,但这太麻烦了,因为我需要做两次,然后再杀死两个进程。此外,POSIX也没有强制使用作业控制。作为可选选项,任何供应商都可以自由包含作业控制或不包含作业控制。