問題タブ [process-substitution]

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.

0 投票する
1 に答える
792 参照

shell - プロセス置換での NUL バイトのスキップ/無視は標準化されていますか?

エグゼクティブサマリー

プロセス置換を行うときにシェルが NUL バイトをスキップするのは標準的な動作ですか?

たとえば、

お譲り致しabcます。printf出力の 16 進ダンプで明らかに出力されていることが示されていても、NUL 値はスキップされます。

私の最初の考えは「単語分割」でした。ただし、実際のプロセス代替を使用する場合は、

結果は類似しており、=単語分割は実行されません。

長い話

この質問に対する適切な答えを探しているときに、プロセス置換から変数に値を読み取るときに、私がかなり慣れている少なくとも 3 つのシェル実装 (ash、zsh、および bash) が NUL 文字を無視することに気付きました。

これが発生するパイプラインの正確なポイントは異なるようですが、最初から存在しなかったかのように、一貫して NUL バイトがドロップされます。

いくつかの実装を確認しましたが、これは正常な動作のようです。

ashinputスキップし'\0'ますが、これが純粋な偶然なのか意図した動作なのかは、コードからは明らかではありません。

bashソース コードには、プロセス置換で NUL 値をスキップしたことを示す明示的な#ifdef警告が含まれています。

zshさんの行動についてはよくわかりません。(内部関数'\0'で定義されているように) メタ文字として認識し、特殊なサロゲート文字を先頭に追加し、入力文字にビット #5 を設定して、基本的にメタ文字を解除します。これにより、makeもスペースになります) 。imeta()Meta'\0'' '

value上記のprintfコマンドにメタ文字が含まれているという証拠がないため、これは後で削除されるようです。私はzshの内部構造に慣れていないので、これを大いに参考にしてください。また、副作用のないステートメントにも注意してください。

zshに NUL (メタエスケープ) を含めることもできることに注意してください(たとえば、なしIFSで単語を分割することが可能になります)。したがって、 との値に応じて異なる結果が得られるはずです(フィールド分割を行います)。find -print0xargs -0printf '\0abc' | read valuevalue=$(printf '\0abc')IFSread

0 投票する
1 に答える
515 参照

bash - プロセスの置換はbashで機能しますが、zshでは機能しません

プロセス置換を使用して while ループにフィードしようとしています。

これは bash では正常に機能しますが、zsh では機能しません。次のエラーが表示されます。

zsh 4.3.10 を使用しています。

これをzshで動作させるにはどうすればよいですか?

更新:完全なコードを共有するために質問を変更しました

0 投票する
1 に答える
1200 参照

bash - Bash リダイレクト: 名前付きパイプと EOF

次のコードを使用します。

アプローチ #3 がハングするのに、他のアプローチはハングしないのはなぜですか? アプローチ #3 をハングさせない方法はありますか?

理論的根拠: 準無名パイプを使用して、非同期で実行されているいくつかのサブプロセスを接続したいので、ファイル記述子がそれを指すようにした後、パイプを削除する必要があります。

0 投票する
1 に答える
37 参照

bash - bash で実行中のプロセスから行を読み取れません

プロセス置換を使用すると、コマンドの出力のすべての行を取得できます。

上記と同じ方法で、「wpa_supplicant」コマンドの stdout 出力を取得し、stderr を破棄します。しかし、画面には何も表示されません!

プロンプトで同じコマンドを入力すると、正常に出力されることを確認しました。

間違いは何ですか?どんな助けでも大歓迎です。

0 投票する
1 に答える
225 参照

linux - ジョブ制御による Bash プロセス置換のバックグラウンド化

20MiB の CSV ファイルのバッチを処理するスクリプトがあり、オプションで約 4MiB まで gzip 圧縮されています。何千ものファイルがあり、それぞれの処理には約 30 秒かかります。非圧縮ファイルまたは圧縮ファイルの読み取りと解凍は「ほぼ瞬時」であり、プロセスがプロセスレベルで並列化できることを強く示唆しています。実際、それは複雑な Ruby パイプラインを使用して行われていることです。ただし、bash を使用して Ruby コードをより小さな部分に分割しようとしています。ジョブ制御のために、私はこのbash関数を考え出しました

wait_until_job_availableこれにより、bash パイプラインをバックグラウンド化する前に、実行可能なジョブの最小数をオプションで指定して を呼び出すことができます(省略した場合は、マシンで使用可能なコアの数がデフォルトになります)。

だから私はそれを次のように使うかもしれません:

ご覧のとおり、これによりすべてのファイルが検索search_pathされ、コマンドに渡されますprocess_file。その際、私はプロセス置換を使用してファイルを cat するか、オンザフライでファイルを解凍します。入力ファイル名は、圧縮されていないファイルの内容を出力するプロセスに置き換えられ、出力ファイルは元のファイル名に「.out」が追加されたものになります。の呼び出しprocess_fileはバックグラウンド化され、ジョブ コントロールに送信されます。ダンディーに見えますよね?

ただし、一部のファイルが正しく処理されていないことに気付きました。

によって処理されると報告されたファイルは、 の別々の同時インスタンスであっても、process_file常に であると報告されることに気付きました。一方、ファイルを一時ファイルに個別にコピーまたは解凍し、一時ファイルの名前を に渡すと、正常に実行され、すべてのファイルが正しく処理されているように見えます。/dev/fd/63process_fileprocess_file

特にディスクに触れること (パフォーマンス) と、処理後に一時ファイルをクリーンアップ (削除) する必要があることに関して、一時ファイルの作成を避けたかったのです。この問題があると、それが妨げられます。置換されたプロセス パイプラインの疑似ファイルの名前にある種の競合状態があるかどうか、私は興味がありますか? それとも、私が誤解しているように見えるプロセスの代替またはジョブ制御について何かありますか?

参考までに、Ubuntu Server 14.04、linux 3.19.0-59 Bash 4.3.11 gzip 1.6 を使用しています。

0 投票する
1 に答える
1432 参照

bash - <() に相当する POSIX シェル

<(commands ...)bash/zsh では、出力動作をファイルとして行います。POSIX に相当するものは存在しますか?

0 投票する
1 に答える
491 参照

bash - プロセス置換でリダイレクトする方法は?

アクセス許可が制限されているファイルに標準エラーをリダイレクトしようとしました。これは私がしたことです:

アイデアは、標準エラーをプロセスにリダイレクトし、umask を変更して、もう一度ログ ファイルにリダイレクトすることでした。

しかし、うまくいきません。コマンドは停止し、 を押すと 141 で終了しreturnます。

Bash のマニュアルでは、マニュアルに「プロセス リスト」が定義されていません。

誰かが失敗を説明できますか?

0 投票する
1 に答える
892 参照

linux - 複数の入力を Ghostscript にパイプする

Ghostscript を使用して、URL からダウンロードされた 2 つの PDF ファイルを結合する 1 行の Linux コマンドを作成しようとしています。ただし、一時ファイルを作成したくありません(すべてメモリ内で行う必要があります)。

次のコマンドは機能していないようです (プロセス置換によってこれを達成しようとしました)。

このコマンドを実行すると、以下のエラーが表示されます。

2 つの入力 PDF のダウンロードが完了する前に、Ghostscript コマンドが実行されていると思われます。おそらく、これが発生するのを待つ方法があります。

0 投票する
1 に答える
101 参照

bash - How do these process substitutions work?

Can someone please explain how these process substitutions are working.

Output

1:2:3:YES:three:two:first

I've figured out, that the 'ssstr'-Substitution got FD 60, sstr FD 61 and str FD 62. (right to left)

But how is (echo "YES") connected to input of FD60, and output of FD60 with input FD61 and so on and finally FD62 prints out on Terminal ?

All against the direction of the two redirections.

How are they nested, and how connected ? Makes me crazy. Ty.

0 投票する
0 に答える
176 参照

bash - pv によるプロセス置換の結果、空のファイルが生成される

Bash プロセス置換pvを使用してコマンドを操作する際に問題が発生しています。tar

私はこのように使うことができpv、それは動作します:

プロセス置換を次のように使用することcatもできます:

しかし、このコマンドの結果は空になりますfile.tar:

私もtar cvf >(pv - > file.tar) dir同じ結果で試しました。

私の目標は、pv進行状況を出力し、出力tar(つまり、ファイルとエラーのリスト) を他のコマンドにパイプして、追加の処理を行うことです。上記の最初のコマンド例では、2 つの出力ストリームのみが生成されます。stdoutバイナリ tar データがstderr含まれ、ファイルのリストとエラー メッセージの両方が含まれます。プロセス置換を使用すると、3 つの出力ストリームが生成されます。バイナリ tar データは新しいプロセスに送られ、stdoutファイルのリストがstderr含まれ、エラー メッセージが含まれます。

コマンドを Bash プロセス置換で使用できますpvか?

と を使用pv 1.6.0してGNU bash, version 4.3.46(1)-releaseいます。

興味深いことに、strace試してデバッグするために使用すると、次pvのように機能します。