首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >coproc <command>与<command> &?

coproc <command>与<command> &?
EN

Unix & Linux用户
提问于 2018-10-01 12:05:56
回答 2查看 2K关注 0票数 4

我已经读到,$coproc < command >$< command > &不同,因为coproc将在子shell进程中执行command

但是当我测试它的时候,它就像$< command > &一样工作。试验结果如下:

首先:测试$< command > &的行为。

  1. $nano &上运行tty1
  2. 在另一个tty上,$ps -t tty1 --forest的输出表明纳米进程是-bash进程的子进程(登录bash进程->没有创建子shell进程)。

第二:测试$coproc < command >的行为

  1. $coproc nano上运行tty1
  2. 在另一个tty上,来自$ps -t tty1 --forest的输出与上面相同(没有创建子shell进程)。

那么,$coproc < command >$< command > &是完全相同的吗?

使用的shell是一个bash shell

EN

回答 2

Unix & Linux用户

发布于 2018-10-01 13:08:04

coproc utilityutility &bash中是不一样的。

使用coproc utility,您可以得到一个数组COPROC,它包含utility的标准输入和输出文件压缩器。然后你可以做这样的事情

代码语言:javascript
复制
#!/bin/bash

coproc bc -l

for (( k = 0; k < 50; ++k )); do
  printf '2.3*%d + 1\n' "$k" >&${COPROC[1]}
  read -u "${COPROC[0]}" a
  printf '%.2f\n' "$a"
done

kill "$COPROC_PID"

在这里,bc -l是一个共同进程,它的作用类似于shell循环的“算术计算服务”,它使用表达式对其标准输入进行计算,并返回其标准输出的结果。

据我所知,bash在任何时候都只支持一个协同进程.

ksh93 shell也支持协同进程,但语法完全不同(但有点时髦)。这是等价的ksh93脚本:

代码语言:javascript
复制
#!/usr/bin/ksh93

bc -l |&
coproc_pid=$!

for (( k = 0; k < 50; ++k )); do
  print -p -f '2.3*%d + 1\n' "$k"
  read -p a
  printf '%.2f\n' "$a"
done

kill "$coproc_pid"

这里,是printreadD14选项使它与协同进程(进程从|&开始)进行通信,而不是使用一些显式的文件复制器。

票数 4
EN

Unix & Linux用户

发布于 2018-10-01 12:20:20

区别在于创建两个I/O通道,如man bash中所述:

协同进程在子shell中异步执行,就像命令已经使用& control操作符终止一样,在执行的shell和协同进程之间建立了一个双向管道。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/472561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档