タグ付けされた質問 「pipe」

Unixパイプは、2つのプロセスのファイル記述子を接続します。パイプは、<unistd.h>で宣言されたPOSIX pipe()関数で作成されます。シェルは、「|」を使用してプロセス間にパイプを作成します。

6
シェル内の複数のファイルへのパイプ
ディスクに保存したくない大量のデータを生成するアプリケーションがあります。アプリケーションは主に、使用したくないデータを出力しますが、個別のファイルに分割する必要がある有用な情報のセットを出力します。たとえば、次の出力がある場合: JUNK JUNK JUNK JUNK A 1 JUNK B 5 C 1 JUNK 次のようにアプリケーションを3回実行できます。 ./app | grep A &gt; A.out ./app | grep B &gt; B.out ./app | grep C &gt; C.out これは私が欲しいものを手に入れるだろうが、時間がかかりすぎるだろう。また、すべての出力を単一のファイルにダンプし、それを解析したくありません。 上記の3つの操作を組み合わせて、アプリケーションを1回実行するだけで3つの個別の出力ファイルを取得する方法はありますか?
29 bash  shell  grep  pipe 

1
>ファイルがechoよりもリアルタイムを使用する理由| sed> file?
以下の例は私を驚かせました。それは、直感に反するようです... コンボのためのより多くのユーザー時間があるという事実は別としてecho | sed。 単独で実行する場合echo、なぜそんなに多くのsys時間を使用するのでしょうか、または質問sedは「プレイの状態をどのように変更するのですか?」と思われるechoでしょうが、同じ行う必要があるエコー-INGのを両方のケースで... time echo -n a\ {1..1000000}\ c$'\n' &gt;file # real 0m9.481s # user 0m5.304s # sys 0m4.172s time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // &gt;file # real 0m5.955s # user 0m5.488s # sys 0m1.580s
28 bash  shell  pipe  time  echo 

4
1つのプログラムの出力を他の2つのプログラムにパイプする方法はありますか?
これはばかげた質問ですが、私はこのようなことを1行で達成しようとしています: $ prog1 | prog2 $ prog1 | prog3 したがって、基本的にprog1を実行し、出力をprog2とprog3に別々にパイプします(チェーンパイプではありません)。最初は、teeを使おうとしていましたが、出力をファイルにダンプしていましたので、正しくありませんでした(これは望んでいないことです)。 $ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2" ある時点で、これを出力を2つ以上のプログラムにパイプするように拡張したいと思うかもしれませんが、今は単純に始めています。 $ prog1 | prog2 $ prog1 | prog3 $ prog1 | prog4 ...
28 pipe 

6
1つのコマンドから出力されたパス名を「cd」にリダイレクトできないのはなぜですか?
cd別のコマンドからリダイレクトされたディレクトリ名を受け入れようとしています。これらの方法はどちらも機能しません。 $ echo $HOME | cd $ echo $HOME | xargs cd これは動作します: $ cd $(echo $HOME) 最初のコマンドセットが機能しないのはなぜですか?

5
TCPDUMP出力をリアルタイムで処理/パイプする方法
(OpenWrt 10.04ルーター上の)クライアントによるDNS要求をtcpdumpしたい場合、 root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2&gt;&amp;1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br-lan, link-type EN10MB (Ethernet), capture size 96 bytes 22:29:38.989412 IP 192.168.1.200.55919 &gt; 192.168.1.1.53: 5697+ A? foo.org. (25) 22:29:39.538981 IP 192.168.1.200.60071 &gt; 192.168.1.1.53: 17481+ PTR? 150.33.87.208.in-addr.arpa. …
27 pipe  tcpdump 

3
パイプの時間を計るにはどうすればよいですか?
time1つのパイプ出力から別のパイプ出力を持つ2つの個別のコマンドで構成されるコマンドが必要です。たとえば、次の2つのスクリプトを考えます。 $ cat foo.sh #!/bin/sh sleep 4 $ cat bar.sh #!/bin/sh sleep 2 さて、どのようにtimeかかった時間を報告することができますかfoo.sh | bar.sh(そして、はい、ここではパイプが意味をなさないことを知っていますが、これは単なる例です)?パイプなしでサブシェルで順番に実行すると、期待どおりに動作します: $ time ( foo.sh; bar.sh ) real 0m6.020s user 0m0.010s sys 0m0.003s しかし、パイピングすると動作しません: $ time ( foo.sh | bar.sh ) real 0m4.009s user 0m0.007s sys 0m0.003s $ time ( { foo.sh | bar.sh; } …
27 bash  shell  pipe  time 

8
配管、シフト、またはパラメーター拡張はより効率的ですか?
私は単語のスペース区切りリストで互いに離れた一定数の値である特定の値を反復処理する最も効率的な方法を見つけようとしています(配列を使用したくない)。例えば、 list="1 ant bat 5 cat dingo 6 emu fish 9 gecko hare 15 i j" したがって、リストを繰り返し処理し、1、5、6、9、および15のみにアクセスできるようにしたいのです。 編集:リストから取得しようとしている値は、リストの残りの部分と形式が異なる必要がないことを明確にすべきでした。それらを特別なものにしているのは、リスト内の位置だけです(この場合、位置1,4,7 ...)。リストはそうかもしれません1 2 3 5 9 8 6 90 84 9 3 2 15 75 55が、私はまだ同じ数字が欲しいです。また、リストの長さがわからないと仮定して、できるようにしたいと思います。 私がこれまで考えてきた方法は次のとおりです。 方法1 set $list found=false find=9 count=1 while [ $count -lt $# ]; do if [ "${@:count:1}" …

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

1
パイプから読み取るときに「sed q」の動作が異なるのはなぜですか?
この質問は、UnixおよびLinux Stack Exchangeで回答できるため、Server Faultから移行されました。 3年前に移行され ました。 次を含む「test」という名前のテストファイルを作成しました。 xxx yyy zzz 私はコマンドを実行しました: (sed '/y/ q'; echo aaa; cat) &lt; test そして私は得た: xxx yyy aaa zzz それから私は走った: cat test | (sed '/y/ q'; echo aaa; cat) そして得た: xxx yyy aaa 質問 sed「y」のある行が見つかるまで読み取り、出力してから停止します。2番目のケースではなく最初のケースでは、catは残りを読み取って出力します。 誰かがこの行動の違いの背後にある現象を説明できますか? また、Ubuntu 16.04とCentos 6でもこのように動作することに気づきましたが、Centos 7ではコマンドは「zzz」を出力しません。
25 sed  pipe 

1
Linuxでのパイプの仕組み
Linuxカーネルにパイプがどのように実装されているかを読んでいて、私の理解を検証したかったのです。私が間違っている場合は、正しい説明の答えが選択されます。 Linuxには(ユーザー空間ではなく)カーネルにマウントされるpipefsと呼ばれるVFSがあります pipefsには単一のスーパーブロックがあり、独自のルート(pipe:)にマウントされます。/ ほとんどのファイルシステムとは異なり、pipefsは直接表示できません pipefsへのエントリはpipe(2)syscall 経由です pipe(2)配管用のシェルが使用するシステムコール|オペレータ(または手動で任意の他のプロセスからは)ほとんど通常のファイルと同じように動作しpipefsに新しいファイルを作成します パイプオペレーターの左側のstdoutファイルは、pipefsで作成された一時ファイルにリダイレクトされます。 パイプ演算子の右側のファイルには、stdinpipefs上のファイルが設定されています。 pipefsはメモリに格納されており、いくつかのカーネルマジックによってページングされるべきではありません パイプ(例ls -la | less)がどのように機能するかについてのこの説明はほとんど正しいですか? 私が理解していないことの1つは、bashのようなものがどのようにプロセスを設定するstdinかstdout、またはによって返されるファイル記述子に設定することpipe(2)です。私はまだそれについて何も見つけることができませんでした。
25 kernel  pipe 

1
コマンド完了出力をリダイレクトするにはどうすればよいですか?
コマンドラインでは、コマンドの後に&gt;or |演算子を使用して、コマンドの出力をファイルまたは別のコマンドにリダイレクトまたはパイプできます。出力をファイルにリダイレクトしたいというあまり標準的ではない状況に遭遇しましたが、リダイレクトする機会がないようです: 新しいターミナルにいるとき、 [chiliNUT ~]$ Tab最初に何も入力せずに押すと、尋ねられます display all 1725 possibilities? (y or n) そして、を入力するとy、さまざまなコマンドの素敵な長いリストが表示されます。この出力をファイルにリダイレクトまたはパイプするにはどうすればよいですか?&gt; myfile.txtどこにでも入力する機会がないようです。 使用してCentOSのは(決勝)6.4をリリース。

3
lessを使用してパイプをフォローしますか?
(Fを押して)パイプ入力(ファイルと同様)をたどることはできませんか?書き込まれているファイルの場合、コマンド less &lt;file&gt; Fを押すと、ファイルを追跡します。 しかし、次のように出力を直接lessにパイプするコマンドがある場合 command | less Fを押しても何も起こりません。 ファイルができるようにパイプをたどることができないように見えますか?それとも、STDERRへの書き込みコマンドにも関係しているのでしょうか?私が達成しようとしている効果は、常にコマンドの最新の出力を見ることです。Pag​​eDownを押したままにするのと同じです! 関連する発言はG(最後に行く)にも当てはまります:直接lessにパイプすると、機能しません。
25 pipe  less  tail 


4
1つの「while read」ループで変数がローカルになっているのに、一見似ているように見える別のループではないのはなぜですか?
$x以下のスニペットから異なる値を取得するのはなぜですか? #!/bin/bash x=1 echo fred &gt; junk ; while read var ; do x=55 ; done &lt; junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred | …

2
順序付けされたSTDOUT / STDERRをキャプチャし、タイムスタンプ/プレフィックスを追加する方法は?
ほぼすべての 利用可能な 同様の 質問を調査しましたが、役に立ちません。 問題について詳しく説明します。 私はいくつかの無人スクリプトを実行し、これらは標準出力と標準エラー行を生成できます。端末エミュレータで表示される正確な順序でそれらをキャプチャし、「STDERR:」や「STDOUT:」などのプレフィックスを追加します。 私はパイプを使用してみましたが、それらにエポールベースのアプローチさえ使用しませんでした。解決策はptyの使用法にあると思いますが、私はマスターではありません。また、GnomeのVTEのソースコードを覗きましたが、それほど生産的ではありませんでした。 理想的には、これを実現するためにBashの代わりにGoを使用しますが、できませんでした。パイプは、バッファリングのために正しい行順序を維持することを自動的に禁止しているようです。 誰かが似たようなことをすることができましたか?それとも、単に不可能ですか?ターミナルエミュレーターがそれを行うことができる場合、それはできないと思います-PTY(s)を異なる方法で処理する小さなCプログラムを作成することによるのでしょうか? 理想的には、非同期入力を使用してこれら2つのストリーム(STDOUTおよびSTDERR)を読み取り、2番目に必要に応じて再印刷しますが、入力の順序は重要です! 注:stderredは認識していますが、Bashスクリプトでは機能せず、プレフィックスを追加するために簡単に編集できません(基本的に多くのsyscallをラップするため)。 更新: 2つの要点の下に追加 混合stdout / stderrを生成するプログラム例 上記のプログラムから期待される出力 (一貫した結果を証明するために、提供したサンプルスクリプトに1秒未満のランダムな遅延を追加できます) 更新:この質問に対する解決策は、@ Gillesが指摘したように、この他の質問も解決します。しかし、私は、あちこちで尋ねたことをすることは不可能であるという結論に達しました。使用する場合2&gt;&amp;1、両方のストリームを正しくPTY /管のレベルでマージされているが、別々にストリームと1つが実際のアプローチを使用する必要があり、正しい順序で使用するstderredを involesシステムコールをフックとして見ることができるダーティ多くの方法です。 誰かが上記を反証できるなら、私はこの質問を更新したいと思っています。

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