問題タブ [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
がサブシェルで実行され、呼び出し元のシェルで変数を設定できないため、これは失敗します。だから私は代替案としてこれを思いついた
これは正常に動作します。
コプロセスが複数の行を返す場合に何が起こるかをテストするために、私はこれを試しました:
whereconfig-file.cfg
には 3 行が含まれます。
私は、これがファイルの最初の行を処理し、その後にある種の「壊れたパイプ」エラー メッセージが続くことを期待していました。最初の行は処理されましたが、エラー メッセージは表示されず、実行中のコプロセスはありませんでした。
そこで、スクリプトで次のことを試しました。
それを実行する:
残りの 2 行はどこに行ったのでしょうか。「壊れたパイプ」かwait
、残りの行を読み取るものが何もないためにハングすることを期待していましたが、ご覧のとおり、リターン コードはゼロでした。
bash - その他のコプロクに関する質問
これは、bash coproc と残りの coproc 出力のフォローアップです。
一度に1行ずつファイルを処理するために最終的に落ち着いたイディオムは次のとおりです。
cat
入力リダイレクトを使用できるという単純なケースを知っています。これは単純化されたバージョンで、実際のバージョンでは egrep を使用して行のサブセットを選択します。
残念ながら、これは機能しません。
ファイルには 4 行ありますが、2 回目の繰り返しまでに、コプロセスはそのファイル記述子とともに消滅し、${COPROC[*]}
変数は設定解除されているようです (2 回目の読み取りで fd が欠落していることに注意してください)。
問題を複雑にするために、私は Cygwin と Linux (Fedora) の両方で作業していますが、これは 2 つの環境でわずかに異なる動作を示します。Linux では、上記の動作が得られます。Cygwin では、一部のコマンド (つまりecho
、bash 組み込みコマンド) ではこの問題は発生しません。どちらの環境でも、外部コマンドを実行すると、コプロセスが強制終了され、その記述子が破棄されます。
ここでの本当の質問は次のとおりだと思います。
bashで、どうすれば達成できますか
構成ファイルは短いので、ファイル全体を配列にロードする必要がある場合でも機能します。
これがbashで非常に難しいことに本当に驚いています。
bash - bashcoproc-予期しない動作
フォローアップ
以下に示すように、coprocの明らかな使用が期待どおりに機能しないことを考えると、
質問:スクリプトが1行の出力を読み取った後、coprocがなくなるのはなぜですか?
bash - バックグラウンドプロセスはCOPROCにリダイレクトされます
echo
次のテストスクリプトでは、組み込みのバックグラウンドで実行され、標準出力をアタッチする基本コプロセスを実行します。
明らかな理由もなく、スクリプトは常に失敗し、次の出力が表示されます。
正しい構文はむしろこれである必要があるのだろうか(アンパサンドはリダイレクトの前に移動された):
この2番目の例は、実行中にエラーを報告しないため機能しているように見えますが、この構文では、リダイレクトは実際には実行されません。実際、この他のテストを検討してください。
テスト3はファイルを作成しますxfile
が、何も書き込みません。不思議なことに、リダイレクト後にアンパサンドを再度配置しようとすると、echo
作業は正常になります。
テスト4はxfile
、文字列内にファイルを作成しますabc
。
coproc
リダイレクトエラーの原因や正しい構文について何か考えがありますか?
bash - 'wait $COPROC_PID' は待機しません
次のテスト スクリプト:
コンソールを次のようにフラッディングします。
つまりwait
、コプロセスが終了するのを待ちません。
Bash のバージョンは 4.2.0(5) リリースです。これは、4.1.5(1) リリースでは発生しません。
バグだと思いますか?
bash - 「coproc」を使用して別のコマンド駆動型プログラムと対話する方法
わかりました、明らかに私は bash の第一人者ではなく、それが必要です!
これまで「coproc」を使用したことはありませんが、まさに必要なもののようです。しかし、さまざまな「ping」の例から推定できないことを認めなければなりません。[私は数時間試しました...]
私がやりたいことは、標準入力から入力を受け取り、その結果を標準出力に書き込むことができる「coproc」シェルスクリプトを開始することだけです。これらのコマンドと結果の送信と処理をそれぞれメイン スクリプトで実行する必要があります。
これが私がやろうとしていることの最も簡単な概要の1つです :
上記の疑似コードを使用して申し訳ありませんが、これらの送信コマンドがどうあるべきかわかりません! 誰かが詳細を提供できれば、大歓迎です!
bash - bash coproc での行バッファリング
私はbash coproc
を使用しようとしていますが、おそらくバッファリングで問題が発生しています。標準入力からの行指向の入力を受け入れ、入力行ごとに標準出力に行を出力する複雑なコマンドがあります。コマンドラインでは、このコマンドは行ごとに正常に機能しますが、コプロシージャに入れて${COPROC[0]}
FD から読み取ると、読み取りがブロックされます。
この動作は で再現できますが、 では再現できpaste
ませんcat
。パラメータが渡されなかった場合、私はほとんど同じことを期待paste
しています。cat
これは、コマンド プロンプトで直接実行する場合です。
(説明のためRETURN
に^D
追加)
しかし、これらをcoprocに入れると、動作が異なります-cat
厳密に行バッファリングされpaste
ていますが、はるかに大きなバッファで動作しているようです:
paste
この理由は、接続先に応じてバッファリングモードを調整するためだと思いますが、cat
常にラインバッファリングモードになっています。
coproc で強制的にpaste
(または他の一般的なコマンドを) ライン バッファリングする方法はありますか?
もう少し実験を重ねた結果、 coproccat
を使用せずに と の間をパイプするだけで、同様の動作を再現できることがわかりましたpaste
。
(説明のためRETURN
に^D
追加)
- 最初に、パイプ
cat
しcat
て行バッファリングを取得しますが、 - 次に、パイプ
cat
してpaste
行バッファリングを取得します - 最後に、パイプ
paste
してcat
行バッファリングを取得しません
これは、 がインタラクティブ モードの場合は stdout をライン バッファリングすることを示しているように見えpaste
ますが、それ以外の場合は、はるかに大きなバッファを使用します。
bash - coproc およびサブプロセス リダイレクトの代替手段 (Bash 3)
coproc
さて、私は のようなリダイレクト経由またはリダイレクト経由のコプロセスを本当に使用したい状況にあります<(some command)
が、残念ながら、ターゲット環境の 1 つで bash 3.2 に制限されています。つまり、私は私にできることは限られています。
コプロセスが必要な理由は、別のファイルをループしながら、1 つのファイルから行ごとに読み取る必要があるためです。
現在、私はさらに入力が必要なときにいつでもexec <6 /foo/bar
できるように、読み取り用にファイルを開いたままにするために使用しています。read line <&6
これは正常に機能しますが、プレーンテキスト ファイルでのみ機能しますが、実際には、スクリプトを実行する前にファイルを解凍するのではなく、ファイルを圧縮したままにしたいと考えています。
また、プレーンテキストで書き込んで後で圧縮するスペースを無駄にすることなく、新しい圧縮ファイルに書き込むために同じことができる必要があります。
それで…bash 3で利用できる代替手段はありますか? 私が指摘したように、私はすでに別のファイルのループに入っているので、ループとは独立してこれを行う必要があるため、出力を単にパイプするgzip
(またはzcat
ループにパイプする) というオプションはありません。
例を示すために、ここに私が今やっていることの簡略化されたバージョンがあります:
タイプミスと実際のスクリプトの一般的な無用さを許してください。私はそれをかなり単純にしたかっただけです。ご覧のとおり、問題なく動作しますが、無駄なプレーンテキスト ファイルのおかげで、最適とは言えません。