coprocですそして&? [コピー]

coprocですそして&? [コピー]

私はこれがサブシェルプロセスで実行するのとは異なることを読んでいます$coproc < command >$< command > &coproccommand

しかし、テストしてみると、$< command > &次のように動作します。

まず、テスト行為です$< command > &

  1. $nano &走るターミナル1
  2. 他のttyでは、$ps -t tty1 --forest出力は、nanoプロセスが-bashプロセスの子プロセスであることを示しています(ログインbashシェルプロセス - >生成されたサブシェルプロセスはありません)。

2番目:テスト動作$coproc < command >

  1. $coproc nano走るターミナル1
  2. 他のttyでは、出力は$ps -t tty1 --forest上記と同じです(サブシェルプロセスは作成されません)

それでは、$coproc < command >同じことですか$< command > &

使用されたシェルはバッシュシェル

ベストアンサー1

coproc utilityutility &と同じではありませんbash

標準の入出力ファイル記述子を含むcoproc utility配列を取得します。それからあなたは次のことをすることができますCOPROCutility

#!/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シェルループの「算術計算サービス」のように動作し、標準入力に対して計算を実行するための式を取り、標準出力に結果を返すコプロセスです。

私が知っている限り、それだけをサポートしてbashいます一ついつでもコラボしてください。

シェルはksh93共同プロセスもサポートしますが、まったく異なる(しかしより洗練された)構文を使用します。これに対応するスクリプトは次のとおりです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"

ここでは-p、明示的なファイル記述子を使用するのではなく、coprocess(次から始まるプロセス)と通信するようにするオプションがあります。printread|&

おすすめ記事