タグ付けされた質問 「process-substitution」

プロセス置換は、コマンドの入力または出力をファイルとして表示できるプロセス間通信の形式です( `<(cmd)`や `>(cmd)`など)。

5
プロセス置換とパイプ
私は次を理解する方法を疑問に思っていました: コマンドのstdoutを別のコマンドのstdinにパイプすることは強力な手法です。しかし、複数のコマンドの標準出力をパイプする必要がある場合はどうでしょうか?これがプロセス置換の出番です。 言い換えると、プロセス置換はパイプでできることは何でもできますか? プロセス置換は何ができますが、パイプはできませんか?

2
プロセス置換により、パイプである/ dev / fd / 63というファイルが作成されるのはなぜですか?
この特定の例のコンテキストで名前付きパイプを理解しようとしています。 私が入力し&lt;(ls -l)、私の端末にとのような出力を得ますbash: /dev/fd/63: Permission denied。 と入力するcat &lt;(ls -l)と、ディレクトリの内容が表示されます。私が交換した場合catにecho、私は端末名を取得すると思います(またはそれを何ですか?)。 echo &lt;(ls -l)出力をとして与えます/dev/fd/63。 また、この出力例は私には不明確です。 ls -l &lt;(echo "Whatever") lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -&gt; pipe:[48078752] ただし、指定するとls -l &lt;()、ディレクトリの内容が一覧表示されます。 名前付きパイプの場合はどうなりますか?

2
なぜ `sort <(ls -l)`は機能するのに `sort <(ls -l)`は失敗するのですか?
今日、私はこの記事でFIFOについて何かを学んでいる:はじめに名前付きパイプに言及し、cat &lt;(ls -l)。 sort &lt; (ls -l)エラーを表示するを使用して、いくつかの実験を行いました。 -bash: syntax error near unexpected token `('` 次に、コマンドに余分なスペースを誤って追加したことがわかりました。 しかし、なぜこの余分なコマンドがこの失敗につながるのでしょうか?リダイレクトシンボルをに近づける必要があるのはなぜ(ですか?

1
一部のコマンドでBASHプロセスの置換が機能しないのはなぜですか?
場合によっては、プロセスの置換が期待どおりに機能しません。以下に例を示します。 入力: gcc &lt;(echo 'int main(){return 0;}') 出力: /dev/fd/63: file not recognized: Illegal seek collect2: error: ld returned 1 exit status 入力: ただし、別のコマンドで使用すると、期待どおりに機能します。 grep main &lt;(echo 'int main(){return 0;}') 出力: int main(){return 0;} 私は他のコマンドで同様の失敗に気づきました(つまり、プロセス置換からのファイルを期待するコマンドは使用できない/dev/fd/63か、類似しています)。この障害gccは最新のものです。プロセスの置換がこの方法で失敗し、使用すべきでないときを判断するために知っておくべき一般的なルールはありますか? Ubuntu 12.04でこのBASHバージョンを使用しています(archおよびdebianでもこれを見ました): GNU bash、バージョン4.3.11(1)-release(i686-pc-linux-gnu)

2
プロセス置換を実現するポータブル(POSIX)の方法は何ですか?
などの一部のシェルは、次のようbashにプロセス出力をファイルとして表示する方法であるプロセス置換をサポートしています。 $ diff &lt;(sort file1) &lt;(sort file2) ただし、この構造はPOSIXではないため、移植性がありません。どのように達成される置換を処理することができPOSIXにやさしい方法(で動作すなわち1 /bin/sh)? 注:質問は、ソートされた2つのファイルをどのように比較するかを尋ねているのではありません-これは、プロセス置換を示すための不自然な例です!

4
bash:プロセス置換でエラーを伝播する方法は?
シェルスクリプトを使用して実行されたコマンドが失敗するたびにシェルスクリプトが失敗するようにします。 通常、私はそれを以下で行います: set -e set -o pipefail (通常、私set -uも追加します) 問題は、上記のいずれもプロセス置換では機能しないことです。このコードは「ok」を出力し、リターンコード= 0で終了しますが、失敗させたいと思います。 #!/bin/bash -e set -o pipefail cat &lt;(false) &lt;(echo ok) 「pipefail」に相当するものがありますが、プロセスの代替はありますか?コマンドの出力をファイルであるとしてコマンドに渡す他の方法がありますが、これらのプログラムのいずれかが失敗するたびにエラーが発生しますか? 貧乏人の解決策は、これらのコマンドがstderrに書き込むかどうかを検出することです(ただし、一部のコマンドは成功したシナリオでstderrに書き込みます)。 posix準拠のもう1つのソリューションは、名前付きパイプを使用することですが、コンパイル済みコードからオンザフライで構築されたonelinersとして、それらのコマンドを使用するプロセス置換を実行する必要があり、名前付きパイプを作成すると物事が複雑になります(余分なコマンド、削除など)

1
zshでは、cat <(cat)vs cat | cat vs cat =(cat)?
私は同じことcat &lt;(cat)をcat | catすることを期待しました:stdinからstdoutに行をコピーします。私の理解では、両方がcatサブシェルでa を実行し、サブシェルcatのstdoutを一時的な名前付きパイプにcatリダイレクトしてから、stdinをパイプにリダイレクトして現在のシェルで別のシェルを実行します。 代わりに、cat &lt;(cat)端末で入力できますが、入力行はコピー^Dされず、シグナルを送信できませんEOF。cat | cat期待どおりに動作します。 さらなる実験として、にcat =(cat)似た問題があるかどうかを確認cat &lt;(cat)しました^Dが、期待どおりに動作します。aまでのすべてのstdin が一度にstdoutにコピーされます。 誰もzshがボンネットの下で何をしているのかを理解するのを助けることができますか?

4
Dashでプロセス置換をエミュレートする方法は?
ではbash、Process Substitutionを使用して、プロセスの出力をディスクに保存されたファイルのように扱うことができます。 $ echo &lt;(ls) /dev/fd/63 $ ls -lAhF &lt;(ls) lr-x------ 1 root root 64 Sep 17 12:55 /dev/fd/63 -&gt; pipe:[1652825] 残念ながら、プロセス置換はでサポートされていませんdash。 Process Substitutionダッシュでエミュレートする最良の方法は何でしょうか? 出力を一時ファイルとして保存したくない(/tmp/)ので、それを削除する必要があります。別の方法はありますか?

2
プロセス置換出力が順不同です
の echo one; echo two &gt; &gt;(cat); echo three; コマンドは予期しない出力を提供します。 私はこれを読みました:プロセス置換はbashでどのように実装されていますか?インターネット上のプロセス置換に関する他の多くの記事が、なぜこのように動作するのか理解していない。 期待される出力: one two three 実際の出力: prompt$ echo one; echo two &gt; &gt;(cat); echo three; one three prompt$ two また、この2つのコマンドは私の観点からは同等であるはずですが、そうではありません。 ##### first command - the pipe is used. prompt$ seq 1 5 | cat 1 2 3 4 5 ##### …

5
リストからgrepファイル
数百のファイルのリストに対してgrepを実行しようとしています。 $ head -n 3 &lt;(cat files.txt) admin.php ajax/accept.php ajax/add_note.php ただし、ファイル内で見つかったことがわかっている文字列を探していても、次のコマンドはファイルを検索しません。 $ grep -i 'foo' &lt;(cat files.txt) $ grep -i 'foo' admin.php The foo was found ファイルからパターン-fを読み取るフラグに精通しています。しかし、入力ファイルの読み方は? 私は、ファイルを一時ディレクトリにコピーするという恐ろしい回避策を考えていたのでcp、&lt;(cat files.txt)フォーマットをサポートしているようで、そこからファイルをgrepします。シャーリーにはもっと良い方法があります。

3
Bashのプロセス置換をHEREドキュメントと組み合わせる方法は?
Bashバージョン4.2.47(1)-releaseで、HERE-dcoumentからのフォーマットされたテキストを次のように分類しようとすると: cat &lt;(fmt --width=10 &lt;&lt;FOOBAR (I want the surrounding parentheses to be part of the HERE-document) (Even the preceding unbalanced parenthesis should be part of it. FOOBAR ) # I want this paranthesis to end the process substitution. 次のエラーが表示されます。 bash: bad substitution: no closing `)' in &lt;(fmt --width=10 &lt;&lt;FOOBAR (I …

2
Bash:プロセス置換と標準入力
次の行は明らかです。 echo "bla" | foo | bar しかし、以下のものは同じことをしますか? echo "bla" | bar &lt;(foo) echo "bla" | bar &lt; &lt;(foo) どれが標準入力から「bla」fooをbar読み、なぜですか? もちろん、コーディングして確認することはできますが、動作が定義されているのか、信頼すべきではない機能を利用しているのかはわかりません。

4
プロセス置換を使用するときに、終了コードをキャプチャする/エラーを正しく処理するにはどうすればよいですか?
SOのQ&Aから取得した次のメソッドを使用して、ファイル名を解析して配列にするスクリプトがあります。 unset ARGS ARGID="1" while IFS= read -r -d $'\0' FILE; do ARGS[ARGID++]="$FILE" done &lt; &lt;(find "$@" -type f -name '*.txt' -print0) これはうまく機能し、あらゆる種類のファイル名のバリエーションを完全に処理します。ただし、存在しないファイルをスクリプトに渡すこともあります。例: $ findscript.sh existingfolder nonexistingfolder find: `nonexistingfile': No such file or directory ... 通常の状況では、スクリプトで終了コードをキャプチャし、次のようなRET=$?方法で終了コードを取得します。これは、上記のプロセス置換では機能しないようです。 このような場合の正しい手順は何ですか?リターンコードをキャプチャするにはどうすればよいですか?代替プロセスで何か問題が発生したかどうかを判断する他のより適切な方法はありますか?

3
teeを使用してgrepにリダイレクトする方法
Tシャツの使用経験はあまりないので、これがあまり基本的ではないことを願っています。 この質問に対する答えの1つを見た後、私は奇妙な行動に出会いましたtee。 最初の行と見つかった行を出力するために、これを使用できます: ps aux | tee &gt;(head -n1) | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4 ただし、これを(zshで)初めて実行したとき、結果の順序が間違っていて、列ヘッダーがgrepの結果の下にありました(ただし、これは再び起こりませんでした)。 ps aux | tee &gt;(grep syslog) | head -n1 USER PID %CPU %MEM VSZ …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.