问题标签 [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.
bash - bash coproc 和剩余的 coproc 输出
我需要在 bash 脚本中将一些配置数据读入环境变量中。
“明显”(但不正确)的模式是:
这会失败,因为read
它在子 shell 中运行,因此无法在调用 shell 中设置变量。所以我想出了这个作为替代方案
效果很好。
为了测试如果协同进程返回多行会发生什么,我尝试了这个:
其中config-file.cfg
包含三行。
我希望这会处理文件中的第一行,然后是某种“断管”错误消息。虽然它确实处理了第一行,但没有错误消息,也没有协进程在运行。
所以我然后在脚本中尝试了以下内容:
运行它:
剩下的两条线去哪儿了?我本来希望“破管”或wait
挂起,因为没有什么可以读取剩余的行,但正如您所见,返回码为零。
bash - 更多 coproc 问题
这是bash coproc 和剩余的 coproc 输出的后续内容
我最终决定一次处理一行文件的习语是:
我知道cat
我可以只使用输入重定向的简单情况。这是一个简化版本,真正的版本使用 egrep 来选择行的子集。
不幸的是,这不起作用。
看来,即使文件中有 4 行,到第二次迭代时,协进程及其文件描述符已经消失,并且${COPROC[*]}
变量已变为未设置(注意第二次读取中缺少 fd)。
更复杂的是,我同时在 Cygwin 和 Linux (Fedora) 中工作,这在两种环境中表现出略微不同的行为。在 Linux 中,我得到了上述行为。在 Cygwin 中,某些命令(即echo
bash 内置命令)不会导致此问题。在这两种环境中,运行任何外部命令都会杀死协同进程并丢弃它的描述符。
我想这里真正的问题是:
在bash中,我如何完成
配置文件很短,所以如果我必须将整个文件加载到一个数组中,那就可以了。
我真的很惊讶这在 bash 中如此困难。
bash - bash coproc - 意外行为
跟进
鉴于 coproc 的明显使用不像我预期的那样工作,如下所示:
问题:为什么脚本读取一行输出后 coproc 消失了?
bash - 后台进程重定向到 COPROC
在下面的测试脚本中,我运行了一个基本的协同进程echo
,在后台运行的内置程序附加了它的标准输出:
脚本总是失败,没有明显的原因,给出输出:
我想知道正确的语法是否应该是这个(在重定向之前移动和号):
第二个示例似乎有效,因为它在执行期间没有报告错误,但是使用这种语法,实际上不会执行重定向;事实上,考虑这个其他测试:
测试 3 创建文件xfile
,但不向其中写入任何内容。奇怪的是,在重定向后再次尝试定位 & 符号会使echo
工作正常:
测试 4xfile
在字符串中创建文件abc
。
了解导致coproc
重定向错误的原因或正确的语法是什么?
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?
bash - 如何使用“coproc”与另一个命令驱动程序进行交互
好的,显然我不是 bash 大师,我需要一个!
我以前从未使用过“coproc”,但这似乎正是我所需要的。但是,我不得不承认,我无法从那里的各种“ping”示例中推断出来![我确实尝试了几个小时......]
我想做的就是启动一个“coproc”shell脚本,它可以从标准输入中获取输入并将其结果写入标准输出。我希望主脚本分别发送和处理这些命令和结果。
这是我正在尝试做的最简单的大纲之一: EDITED WITH BETTER DETAIL
很抱歉使用上面的伪代码,但我不确定那些发送命令应该是什么!如果有人能提供详细信息,将不胜感激!
bash - bash coproc 中的行缓冲
我正在尝试使用bash coproc
,但遇到了困难,很可能是缓冲。我有一个复杂的命令,它接受来自标准输入的面向行的输入,并在每行输入中打印一行到标准输出。在命令行中,此命令在每行基础上都可以正常工作,但是当我将其放入 coproc 并从${COPROC[0]}
FD 读取时,读取会阻塞。
我可以用 重新创建这种行为paste
,但不能用cat
. 当不传递任何参数时,我期望paste
并且cat
几乎做同样的事情。直接在命令提示符下运行时就是这种情况:
(RETURN
并^D
添加用于说明)
但是当我将它们放在coproc中时,它们的行为会有所不同 -cat
是严格的行缓冲,而paste
似乎是在使用更大的缓冲区进行操作:
我认为这样做的原因是它paste
会根据连接的内容调整其缓冲模式,而cat
始终处于行缓冲模式。
有没有办法强制paste
(或其他通用命令)在 coproc 中进行行缓冲?
经过更多的实验后,我发现我可以在没有coproc的情况下重新创建类似的行为,而只需在cat
and之间进行管道连接paste
:
(RETURN
并^D
添加用于说明)
- 首先,我们一直通过管道
cat
传输cat
并获得行缓冲 - 接下来我们通过管道
cat
传输paste
并一直获得行缓冲 - 最后,我们通过管道
paste
而cat
不是行缓冲
这似乎表明paste
在交互模式下将对其标准输出进行行缓冲,否则它将使用更大的缓冲区。
bash - coproc 和子进程重定向的替代方案 (Bash 3)
好的,所以我处于一种情况,我真的很想通过coproc
或通过重定向使用协同进程<(some command)
,但不幸的是,我在我的一个目标环境中仅限于 bash 3.2,这意味着我我能做的很有限。
我需要协同处理的原因是我需要从一个文件中逐行读取,同时遍历另一个文件。
目前我正在使用exec <6 /foo/bar
创建保持文件打开以供阅读,以便我可以read line <&6
在需要更多输入时进行操作。这工作正常,但它只适用于纯文本文件,但我真的想保持我的文件压缩,而不是在运行我的脚本之前解压缩它们。
我还需要能够对写入新的压缩文件执行相同的操作,而不必浪费空间以纯文本格式写入然后再进行压缩。
那么...... bash 3 中是否有任何替代方案?正如我所指出的,我已经在另一个文件的循环中,所以我没有选择只将输出输入gzip
(或zcat
输入循环),因为我需要独立于循环执行此操作。
举个例子,这是我现在正在做的一个精简版:
原谅任何错别字,以及实际脚本的一般无用,我只是想保持它相当简单。正如您所看到的,虽然它运行良好,但由于浪费了纯文本文件,它并不完全是最佳的。
bash - bash中的嵌套协进程变量
我想知道如何在协程中使用嵌套变量。例如,我可以通过以下方式正常使用嵌套变量。
但我不能为协同进程执行此操作,至少在 shell 脚本中:
这行得通,但这
才不是:
提前致谢。
java - 访问创建它的 bash 脚本之外的协同进程
因此,我在脚本中使用 coproc 命令来运行 java 程序并向其提供输入,如下所示:
我希望能够编写另一个脚本,该脚本可以将更多输入传递给该程序(例如,一个命令将告诉程序运行终止例程)。
有什么方法可以从另一个脚本访问协同进程的标准输入?我目前对终止脚本的尝试如下:
但是,这给了我一个ambiguous redirect
错误,我猜是因为 COPROC[1] 仅在创建 coproc 的脚本中定义。
如果有的话,我还能如何编写一个脚本来实现将一行传递给 java 程序的目标?