问题标签 [coproc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4385 浏览

bash - bash coproc 和剩余的 coproc 输出

我需要在 bash 脚本中将一些配置数据读入环境变量中。

“明显”(但不正确)的模式是:

这会失败,因为read它在子 shell 中运行,因此无法在调用 shell 中设置变量。所以我想出了这个作为替代方案

效果很好。

为了测试如果协同进程返回多行会发生什么,我尝试了这个:

其中config-file.cfg包含三行。

我希望这会处理文件中的第一行,然后是某种“断管”错误消息。虽然它确实处理了第一行,但没有错误消息,也没有协进程在运行。

所以我然后在脚本中尝试了以下内容:

运行它:

剩下的两条线去哪儿了?我本来希望“破管”或wait挂起,因为没有什么可以读取剩余的行,但正如您所见,返回码为零。

0 投票
2 回答
1831 浏览

bash - 更多 coproc 问题

这是bash coproc 和剩余的 coproc 输出的后续内容

我最终决定一次处理一行文件的习语是:

我知道cat我可以只使用输入重定向的简单情况。这是一个简化版本,真正的版本使用 egrep 来选择行的子集。

不幸的是,这不起作用。

看来,即使文件中有 4 行,到第二次迭代时,协进程及其文件描述符已经消失,并且${COPROC[*]}变量已变为未设置(注意第二次读取中缺少 fd)。

更复杂的是,我同时在 Cygwin 和 Linux (Fedora) 中工作,这在两种环境中表现出略微不同的行为。在 Linux 中,我得到了上述行为。在 Cygwin 中,某些命令(即echobash 内置命令)不会导致此问题。在这两种环境中,运行任何外部命令都会杀死协同进程并丢弃它的描述符。

我想这里真正的问题是:

在bash中,我如何完成

配置文件很短,所以如果我必须将整个文件加载到一个数组中,那就可以了。

我真的很惊讶这在 bash 中如此困难。

0 投票
1 回答
1609 浏览

bash - bash coproc - 意外行为

跟进

鉴于 coproc 的明显使用不像我预期的那样工作,如下所示:

问题:为什么脚本读取一行输出后 coproc 消失了?

0 投票
2 回答
2093 浏览

bash - 后台进程重定向到 COPROC

在下面的测试脚本中,我运行了一个基本的协同进程echo,在后台运行的内置程序附加了它的标准输出:

脚本总是失败,没有明显的原因,给出输出:

我想知道正确的语法是否应该是这个(在重定向之前移动和号):

第二个示例似乎有效,因为它在执行期间没有报告错误,但是使用这种语法,实际上不会执行重定向;事实上,考虑这个其他测试:

测试 3 创建文件xfile,但不向其中写入任何内容。奇怪的是,在重定向后再次尝试定位 & 符号会使echo工作正常:

测试 4xfile在字符串中创建文件abc

了解导致coproc重定向错误的原因或正确的语法是什么?

0 投票
1 回答
1260 浏览

bash - 'wait $COPROC_PID' doesn't wait

The following test script:

floods the console with:

That is, wait doesn't wait for the coprocess to terminate.
Bash version is 4.2.0(5)-release. This does not happen with 4.1.5(1)-release.

Do you think it is a bug?

0 投票
1 回答
5264 浏览

bash - 如何使用“coproc”与另一个命令驱动程序进行交互

好的,显然我不是 bash 大师,我需要一个!

我以前从未使用过“coproc”,但这似乎正是我所需要的。但是,我不得不承认,我无法从那里的各种“ping”示例中推断出来![我确实尝试了几个小时......]

我想做的就是启动一个“coproc”shell脚本,它可以从标准输入中获取输入并将其结果写入标准输出。我希望主脚本分别发送和处理这些命令和结果。

这是我正在尝试做的最简单的大纲之一: EDITED WITH BETTER DETAIL

很抱歉使用上面的伪代码,但我不确定那些发送命令应该是什么!如果有人能提供详细信息,将不胜感激!

0 投票
1 回答
841 浏览

bash - bash coproc 中的行缓冲

我正在尝试使用 coproc,但遇到了困难,很可能是缓冲。我有一个复杂的命令,它接受来自标准输入的面向行的输入,并在每行输入中打印一行到标准输出。在命令行中,此命令在每行基础上都可以正常工作,但是当我将其放入 coproc 并从${COPROC[0]}FD 读取时,读取会阻塞。

我可以用 重新创建这种行为paste,但不能用cat. 当不传递任何参数时,我期望paste并且cat几乎做同样的事情。直接在命令提示符下运行时就是这种情况:

RETURN^D添加用于说明)

但是当我将它们放在中时,它们的行为会有所不同 -cat是严格的行缓冲,而paste似乎是在使用更大的缓冲区进行操作:

我认为这样做的原因是它paste会根据连接的内容调整其缓冲模式,而cat始终处于行缓冲模式。

有没有办法强制paste(或其他通用命令)在 coproc 中进行行缓冲?


经过更多的实验后,我发现我可以在没有的情况下重新创建类似的行为,而只需在catand之间进行管道连接paste

RETURN^D添加用于说明)

  • 首先,我们一直通过管道cat传输cat并获得行缓冲
  • 接下来我们通过管道cat传输paste并一直获得行缓冲
  • 最后,我们通过管道pastecat不是行缓冲

这似乎表明paste在交互模式下将对其标准输出进行行缓冲,否则它将使用更大的缓冲区。

0 投票
2 回答
798 浏览

bash - coproc 和子进程重定向的替代方案 (Bash 3)

好的,所以我处于一种情况,我真的很想通过coproc或通过重定向使用协同进程<(some command),但不幸的是,我在我的一个目标环境中仅限于 bash 3.2,这意味着我我能做的很有限。

我需要协同处理的原因是我需要从一个文件中逐行读取,同时遍历另一个文件。

目前我正在使用exec <6 /foo/bar创建保持文件打开以供阅读,以便我可以read line <&6在需要更多输入时进行操作。这工作正常,但它只适用于纯文本文件,但我真的想保持我的文件压缩,而不是在运行我的脚本之前解压缩它们。

我还需要能够对写入新的压缩文件执行相同的操作,而不必浪费空间以纯文本格式写入然后再进行压缩。

那么...... bash 3 中是否有任何替代方案?正如我所指出的,我已经在另一个文件的循环中,所以我没有选择只将输出输入gzip(或zcat输入循环),因为我需要独立于循环执行此操作。

举个例子,这是我现在正在做的一个精简版:

原谅任何错别字,以及实际脚本的一般无用,我只是想保持它相当简单。正如您所看到的,虽然它运行良好,但由于浪费了纯文本文件,它并不完全是最佳的。

0 投票
1 回答
319 浏览

bash - bash中的嵌套协进程变量

我想知道如何在协程中使用嵌套变量。例如,我可以通过以下方式正常使用嵌套变量。

但我不能为协同进程执行此操作,至少在 shell 脚本中:

这行得通,但这

才不是:

提前致谢。

0 投票
1 回答
94 浏览

java - 访问创建它的 bash 脚本之外的协同进程

因此,我在脚本中使用 coproc 命令来运行 java 程序并向其提供输入,如下所示:

我希望能够编写另一个脚本,该脚本可以将更多输入传递给该程序(例如,一个命令将告诉程序运行终止例程)。

有什么方法可以从另一个脚本访问协同进程的标准输入?我目前对终止脚本的尝试如下:

但是,这给了我一个ambiguous redirect错误,我猜是因为 COPROC[1] 仅在创建 coproc 的脚本中定义。

如果有的话,我还能如何编写一个脚本来实现将一行传递给 java 程序的目标?