Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将'jobs-p'的输出捕获到变量中_Linux_Bash_Shell - Fatal编程技术网

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也没有强制使用作业控制。作为可选选项,任何供应商都可以自由包含作业控制或不包含作业控制。