O comando coproc é igual ao comando &? [duplicado]

1

Eu li que $coproc < command > é diferente de $< command > & em que coproc executará command em um processo de sub-shell.

Mas quando eu testei, funcionou como $< command > & . O teste é como segue:

Primeiro: teste o comportamento de $< command > & .

  1. Executar $nano & em tty1
  2. Em outro tty, a saída de $ps -t tty1 --forest indica que nano process é o processo filho do processo -bash (login do processo shell bash - > nenhum processo sub-shell foi criado)

Segundo: teste o comportamento de $coproc < command >

  1. Executar $coproc nano em tty1
  2. Em outro tty, a saída de $ps -t tty1 --forest é igual à anterior (nenhum processo de sub-shell foi criado)

Então, $coproc < command > é simplesmente o mesmo que $< command > & ?

O shell usado foi um bash shell

    
por Tran Triet 01.10.2018 / 14:05

2 respostas

2

A diferença é a criação de dois canais de E / S, conforme descrito em man bash :

A coprocess is executed asynchronously in a subshell, as if the command had been terminated with the & control operator, with a two-way pipe established between the executing shell and the coprocess.

    
por 01.10.2018 / 14:20
2

coproc utility não é o mesmo que utility & em bash .

Com coproc utility , você obtém uma matriz, COPROC , que contém os arquivos de entrada e saída padrão de utility . Você pode então fazer coisas como

#!/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"

Aqui, bc -l é um co-processo e age como um "serviço de computação aritmética" para o loop de shell, usando expressões para calcular em sua entrada padrão e devolvendo resultados em sua saída padrão.

Até onde eu sei, bash também suporta apenas um co-processo um a qualquer momento.

O shell ksh93 também suporta coprocessos, mas a sintaxe é totalmente diferente (mas um pouco mais elegante). Este é o equivalente ao script ksh93 :

#!/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"

Aqui, é a opção -p para print e read que faz com que ele se comunique com o co-processo (o processo começou com |& ) em vez de usar algum filedescriptor explícito.

    
por 01.10.2018 / 15:08