更多 coproc 问题

2024-03-03

这是后续bash coproc 和剩余的 coproc 输出 https://stackoverflow.com/questions/7651946

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

coproc cat auto/etc/build.cfg
while read -u ${COPROC[0]} BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
do
    ... commands ...
done

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

不幸的是这不起作用。

$ cat test.sh
coproc cat auto/etc/build.cfg
while read -u ${COPROC[0]} BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
do
    echo hello
done

$ bash -x test.sh
+ read -u 63 BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
+ cat auto/etc/build.cfg
+ echo hello
hello
+ read -u BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
test.sh: line 2: read: BRANCH: invalid file descriptor specification

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

让事情变得复杂的是,我在 Cygwin 和 Linux (Fedora) 中工作,这在两种环境中表现出略有不同的行为。在 Linux 中我得到了上面描述的行为。在 Cygwin 中一些命令(即echo,它是 bash 内置函数)不会导致此问题。在这两种环境中,运行任何外部命令都会终止协进程并丢弃其描述符。

我想这里真正的问题是:

在 bash 中,我该如何完成

while read (list of vars) from file
do
    one or more commands
done

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

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


我不确定你为什么使用coproc不管用。你的例子对我有用bashMac OS X 上的 4.2.8。也许某些版本bash这里有越野车。

听起来您可以从进程替换重定向,而不是使用协进程。

while read foo bar baz quux; do
    : use foo, bar, baz, quux in various commands
done < <(commands | that | generate --your lines-to-read)

当您的输入尚未位于可以使用普通重定向的简单文件中时,这会很方便。


如果你想坚持coproc,您也许可以使用替代公式:

coproc { commands | that | generate --your lines-to-read ; }
while read foo bar baz quux; do
    : use foo, bar, baz, quux in various commands
done <&${COPROC[0]}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更多 coproc 问题 的相关文章

  • 从配置文件中读取分配

    我有配置文件 其中每行都包含用分号分隔的分配 像这样的东西 模仿正常的 shell 分配 VAR1 1 VAR2 2 VAR1 3 VAR2 4 每行包含相同的变量 并且旨在单独处理 这些配置文件都在系统管理员的控制之下 所以使用eval现
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 在 Bash 中使用“$RANDOM”生成随机字符串

    我正在尝试使用 Bash 变量 RANDOM创建一个由包含整数和字母数字的变量中的 8 个字符组成的随机字符串 例如 var abcd1234ABCD 我怎样才能做到这一点 使用参数扩展 chars 是可能的字符数 是模运算符 chars
  • 如何在变量中存储标准错误

    假设我有一个如下所示的脚本 无用 sh echo This Is Error 1 gt 2 echo This Is Output 我还有另一个 shell 脚本 也无用 sh useless sh sed s Output Useless
  • 如何编写bash脚本来设置全局环境变量?

    最近写了一个设置环境变量的脚本 看一下 bin bash echo Pass a path read path echo path defaultPath home whoami Desktop if n path then export
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • OSX 终端在启动时无法识别 ~/.bashrc 和 ~/.bash_profile

    OSX 识别我的 bashrc 和 bashprofile 的唯一方法是我在终端的首选项中指定启动时要定位的文件 他们没有按应有的方式工作有什么原因吗 这是我的 bashrc 的内部 s HOME rvm scripts rvm sourc
  • git push 无法在 cron 作业中工作

    我目前正在清理 CentOS 6 服务器上其他人留下的烂摊子 有一个应用程序需要每6小时备份一次到github帐户 有一个脚本负责准备数据并负责 git add 和 git commit git Push 由 expect 脚本负责 这样做
  • Linux 从设备本身运行的脚本卸载设备

    我在路径中安装了一个 iso 映像 mnt iso 在这个 iso 中我有一个安装脚本 install sh 我从 iso 运行安装脚本 最后脚本询问用户是否要卸载 iso 本身 如果用户按 y 脚本将执行以下代码 cd umount mn
  • 单元测试 Bash 脚本

    我们的系统除了 Java 代码之外还运行一些 Bash 脚本 既然我们正在努力测试所有可能损坏的东西 并且那些 Bash 脚本可能会损坏 我们想测试它们 问题是很难测试 Bash 脚本 有没有测试 Bash 脚本的方法或最佳实践 或者我们应
  • 禁用 Psql 输出中的换行

    在 Linux 中使用 Psql 时 如果 SQL 查询的结果包含许多列或长字符串数据 它将包装初始视图 只有当我滚动到一侧时 它才会停止包装并在单独的行上显示每一行 我尝试过各种 pset options https www postgr
  • 如何使用管道字符分隔符分隔字段

    我知道这个问题已经被问过 但我发现没有一个解决方案对我有用 我有一个程序 其输出如下 COUNT 293 1 lps 我对第二个字段感兴趣 但是这些尝试都没有成功 spawn 1 cut d f2 spawn 1 cut d f2 spaw
  • bash后台进程修改全局变量

    在我的 Bash 脚本中 我有一个全局变量foo设置为某个值和函数过程back func这是在后台运行的 我希望后台进程能够访问foo并修改其值 以便主进程可以看到变化 我的脚本的结构如下 bin bash foo 0 function b
  • 如果给定键对应的值以指定字符串开头,则使用 jq 更新 JSON 文档中的对象

    我有给定的 JSON 并想更改id所有元素的值 以test in the name元素 other value some id values name test 2017 12 01 id 1 name othert id 2 以下 jq
  • 相当于 Python 中的 set -o pipelinefail 吗?

    我有一些 Python 脚本 每个脚本都大量使用排序 uniq ing 计数 gzipping 和gunzipping 以及 awking 第一次运行我使用的代码subprocess call 是的 我知道安全风险 这就是为什么我说这是第一
  • seq 使用逗号作为小数点分隔符

    我注意到一个奇怪的现象seq我的一台计算机 Ubuntu LTS 14 04 上的行为 不是使用点作为小数点分隔符 而是使用逗号 seq 0 0 1 0 2 0 0 0 1 0 2 我的另一台 PC 上相同版本的 seq 8 21 给出了正
  • 我可以使用 GIT_CONFIG 环境变量来为所有 git 命令使用配置文件吗

    我一直在尝试使用 git 配置文件export GIT CONFIG
  • brew install python,但随后:“python-2.7.6 已安装,只是未链接”

    免责声明 菜鸟 操作系统 10 8 5 当我在 bash 中安装 python 时 我得到了这个警告和错误 https i stack imgur com TBgBT png Warning Could not link python Un
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i

随机推荐

  • 领域模型模式示例

    我只是想找一些 Martin Fowler 的例子领域模型 http martinfowler com eaaCatalog domainModel html模式 而我不能 根据我在互联网领域模型上发现的内容 只是向类添加一些 逻辑 方法
  • 如何防止 PyCharm 覆盖 matplotlib 中设置的默认后端?

    我已将默认后端设置为Qt5Agg in config matplotlib matplotlibrc 如果我使用常规 ssh 提示符并打开 这会起作用ipython并运行import matplotlib as mpl 我正确地得到 mpl
  • 带时间戳零的 PHP 日期返回 1 小时

    如果我执行以下操作 date H i s 0 它返回01 00 00 同时它should give 00 00 00 它可能与我的本地主机的时区有关吗 世界标准时间 1 如果是这样 我该如何解决这个问题 致电前设置时区date 你将使用da
  • 为什么在SciPy中使用integrate.odeint时不调用Dfun(gradient)?

    任何人都可以提供一个向 a 提供雅可比行列式的示例吗 integrate odeintSciPy 中的函数 我尝试从 SciPy 教程运行此代码代码示例 http docs scipy org doc scipy dev reference
  • gwt 中的会话管理

    我正在开发 GWT ext 应用程序 在此应用程序中 我管理客户端会话 为此我写了下面的代码 管理会话 导入 com google gwt user client Timer public class ClientTimers privat
  • 创建霍夫曼树时增加权重时哪个节点向左或向右

    我正在尝试创建一棵霍夫曼树 但阅读互联网上的几个链接时我有点困惑 有些在左侧添加较大 就权重而言 的子节点 有些在右侧添加 所以我的问题是 1 在哪里添加节点 左边还是右边 真的有问题吗 2 我可以在右侧添加权重较大的节点还是在左侧添加权重
  • 使用映射与记录之间的差异以及何时使用

    我正在尝试将一些使用 Map 的 Java 代码映射到 Typescript 代码 我最初的想法是在 Typescript 中使用 Map 但对于我创建的界面来说这并没有成功 相反 我发现 Records 似乎完美地模拟了 Java 的 M
  • Nodejs API 调用将未定义返回到 lambda 函数

    这是将调用 api 的 aws lambda 函数 use strict var request require request exports handler function event context callback let url
  • 添加对旧变更日志文件的更改。液体碱

    我有很多包含数据库初始数据的变更日志文件 之前所有表都位于 Postgres 公共模式中 但现在我已将它们分布在不同模式之间 以便初始数据的更改无法到达表 我可以用初始数据更改所有旧文件并添加 schemaName my schema 还是
  • 从电子邮件标头转换数据

    有谁可以帮助我如何转换电子邮件标题中的数据 我有电子邮件标题中的下一个日期格式 Wed 28 Apr 2010 21 59 49 0400 我需要将它们转换为 mysql 日期或时间戳 谢谢 你应该使用DateTime http php n
  • 让其他人可以在 Xcode 中访问我的开发团队

    我有一个 单一会员 Apple 会员资料 与我合作的一位开发人员需要访问我的开发团队来测试他在其设备上构建的应用程序 Xcode 不允许他在没有该资料的情况下构建应用程序 我怎样才能让他访问开发团队 而不必向他提供我帐户的登录凭据 由于您拥
  • 如何从另一张表中获取精确匹配的数据?

    我在 数据库 工作表中有数据 如下所示 我编写了一个简短的代码来获取与 数据库 工作表中的某些条件匹配的数据 并将其粘贴到另一张 选定记录 工作表上 这是我的代码 Sub CopyData Dim db As Worksheet Dim r
  • 我应该将私有类方法设置为静态吗?

    是否有将类中的私有方法设为静态的最佳实践 我有一堂有几种方法的课 其中一些可以很容易地静态化 因为它们只是处理数据 我应该让它们静态还是让它们保持原样 这更多的是风格问题吗 有性能方面的考虑吗 Edit 方法可以变成静态的 但是应该吗 ht
  • 为什么 strdup 被认为是邪恶的

    我看过一些海报说strdup是邪恶的 对此有共识吗 我使用它时没有任何负罪感 并且看不出为什么它比使用它更糟糕malloc memcpy 我唯一能想到的可能是赚钱strdup众所周知 调用者可能会滥用它 例如 没有意识到他们必须释放返回的内
  • 将秒转换为分钟、小时和天的函数

    问题 编写一个程序 要求用户输入秒数 其工作原理如下 一分钟有 60 秒 如果用户输入的秒数大于或等于 60 则程序应显示该秒数中的分钟数 一小时有 3600 秒 如果用户输入的秒数大于或等于 3600 则程序应显示该秒数内的小时数 一天有
  • 添加 Sprite 的多个实例?

    我正在构建一个自定义图像选择器 它显示 6 个替代版本 然而 照片只显示在第 6 件商品上 model selectedPhoto返回一个 Sprite 并且不会让应用程序正常运行 但是当我使用 model photos ii 每个项目都添
  • 何时在 TypeScript / Angular 中使用接口和模型

    我最近观看了有关 Angular 2 with TypeScript 的教程 但不确定何时使用接口以及何时使用数据结构模型 接口示例 export interface IProduct ProductNumber number Produc
  • Blazor 服务器端应用程序上的子 Blazor 应用程序

    将客户端 Blazor 应用添加到服务器端 Blazor 应用 Hi 继续这里的有用答案 升级到预览版 6 后 Blazor 子应用程序出现 404 错误 https stackoverflow com questions 56586677
  • 如何在新的 AppDomain 中运行 WPF 应用程序?执行程序集失败

    我正在尝试使用应用程序域从控制台应用程序启动 WPF 应用程序 但当我这样做时 我会收到意想不到的错误 独立运行 WPF 应用程序可以正常工作 这段代码也有效 var baseDirectory AppDomain CurrentDomai
  • 更多 coproc 问题

    这是后续bash coproc 和剩余的 coproc 输出 https stackoverflow com questions 7651946 我最终决定一次一行处理文件的习惯用法是 coproc cat auto etc build c