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

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

4
パイプを理解する方法
bashでパイプを使用したとき、これについてはあまり考えませんでした。しかし、システムコールpipe()とfork()を使用してCコードの例を読むと、匿名パイプと名前付きパイプの両方を含むパイプをどのように理解するのか疑問に思います。 「Linux / Unixのすべてがファイルである」とよく言われます。パイプは実際にはファイルであるため、接続する部分の1つはパイプファイルに書き込み、他の部分はパイプファイルから読み取るのでしょうか。はいの場合、匿名パイプのパイプファイルはどこに作成されますか?/ tmp、/ dev、または...? ただし、名前付きパイプの例から、パイプを使用すると、一時ファイルを明示的に使用するよりもスペースと時間のパフォーマンスが優れていることがわかりました。また、パイプはファイルのようにデータを保存しないようです。したがって、パイプは実際にはファイルであるとは思えません。

2
タイムアウト、パイプとトイレの破壊
いくつかの解凍プログラムのベンチマークをすばやく行うというアイデアがありました。たとえば、gzの場合、次のコマンドを実行します。 timeout 10 zcat foo.gz | wc -c 圧縮解除プログラムが10秒で抽出できるデータ量を測定します。 唯一の問題は、それが機能しないことです。zcatが強制終了されると、wcも強制終了されるため、バイトカウントは取得されず、Terminatedメッセージのみが取得されます。 だから、問題は次のとおりです:wcからカウントを取得する方法はありますか? もちろん、代替手段があります: 一時ファイルへの書き込み: timeout 10 zcat foo.gz &gt; /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x これに伴う問題は、大量のメモリを使用することであり、パフォーマンスが低下する可能性があることです。 代わりにulimitを使用する: ulimit -t 10; zcat foo.gz | wc -c これも機能しますが、CPU時間のみを測定するため、I / Oによるスローダウン(圧縮が悪化し、ディスクからより多くのバイトを読み取る必要があるため)は測定されません。 より小さなテストファイルを作成する: まあ、これはもちろん動作する可能性があり、最も良いソリューションかもしれません。ただし、これにより多くの一時ファイルが作成されます。
20 pipe  timeout 

3
ノンブロッキングバッファリングの名前付きパイプ?
私は存在しないと思われるものを探しています:コマンドラインから使用するための非ブロッキングバッファ付き名前付きパイプ(fifo)。そのようなことはありますか? 使用例は次のとおりstdoutです。バックグラウンドで長時間実行して、大量の出力をに出力するプロセスがあるとします。私は出力をあまり気にせず、それを保存したくはありません(おそらく十分なスペースがありません)そしてその仕事をするためにそれを残します。そのため、この理論上のバッファリングされた非ブロッキングの名前付きパイプに出力をリダイレクトし、定期的にそれを利用したいと思います。 だから基本的に私はこのように開始したい(10Mバッファのサイズである): mkmagicfifo magicfifo 10M spewingprocess &gt; magicfifo &amp; ...そして定期的に立ち寄って、何が起こっているのかを確認します... tail -f magicfifo ... すべての出力を magicfifo保存せずに(つまり、通常のファイルではなく)、いっぱいになってタップされないときに噴出プロセスをブロックしません(したがって、通常の名前付きパイプではありません)。 私はすべてのデータをどこかに保存する必要があるので、それを含むソリューションはそれを含むtailまたはそれpruneを行うとは思いません(まあ、私はそれを含む回避策を考えることができます)そして、すべての出力を生成するプロセスのリダイレクトを壊す(私はこれを証明して/試していない認めるよ)おそらく、ファイルを書き換える必要があります。tailtailprune これを行うためのユーティリティを書くことができると期待していますが、* nixにはファイルやパイプなどのクールな側面がたくさんありますが、これが存在すると思いますが、私はそれについて知らないだけです。 So:そのようなことはありますか?

3
catを介してパイプされた場合、grepはEOFまで出力されません
この最小限の例を考えると ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) それを出力LINE 1し、その後、1秒後に、出力はLINE 2、として期待されます。 これをパイプすると grep LINE ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE 振る舞いは前のケースと同じで、予想通りです。 あるいは、これを cat ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" …
19 bash  grep  pipe 

2
受け取っているアプリケーションを殺さずにLinux teeコマンドを終了する方法
Linuxマシンの電源が入っている限り実行するbashスクリプトがあります。以下に示すように開始します。 ( /mnt/apps/start.sh 2&gt;&amp;1 | tee /tmp/nginx/debug_log.log ) &amp; 起動後、ps出力にteeコマンドが次のように表示されます。 $ ps | grep tee 418 root 0:02 tee /tmp/nginx/debug_log.log 3557 root 0:00 grep tee ログが特定のサイズに達すると、teeが生成するログのサイズを監視し、teeコマンドを強制終了する機能があります。 monitor_debug_log_size() { ## Monitor the file size of the debug log to make sure it does not get too big while true; do cecho …
19 linux  scripting  pipe  kill  tee 

4
相互接続されたコマンド間でデータの循環フローを実装するにはどうすればよいですか?
コマンドを相互に接続する方法は2種類あります。 パイプを使用して(次のコマンドのstd-outputをstd-inputに入力します)。 Teeを使用して(出力を多数の出力に接合します)。 それが可能かどうかわからないので、仮想の接続タイプを描画します。 たとえば、コマンドの代わりに変数を使用するこの擬似コードのように、コマンド間でデータの循環フローを実装するにはどうすればよいでしょうか。 pseudo-code: a = 1 # start condition repeat { b = tripple(a) c = sin(b) a = c + 1 }

3
readarray(またはパイプ)の問題
私はreadarrayコマンドの奇妙な振る舞いに固執しました。 man bash状態: readarray Read lines from the standard input into the indexed array variable array しかし、これらのスクリプトは機能しません(配列は空です): unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]} unset arr; cat /etc/passwd | readarray arr; echo ${#arr[@]} そして、これらの仕事: unset arr; readarray arr &lt; /etc/passwd ; echo ${#arr[@]} unset …
19 bash  pipe 

3
シェルメタキャラクターとしての^の使用
今日私は含まれている小さなスクリプトを書きました grep -q ^local0 /etc/syslog.conf レビュー中、同僚は、Bourneシェルの「パイプ」を意味する^local0ため、引用することを提案し^ました。この主張に驚いて、私はこれに言及した参考文献を追跡しようとしました。インターネット上でこれが問題だと示唆するものはありませんでした。 ただし、bshAIX 7の(Bourneシェルであると主張する)の実装には、実際に次の動作があることがわかります。 &gt; bsh $ ls ^ wc 23 23 183 $ ls | wc 23 23 183 私が試した他の「Bourneシェル」実装は、この方法で動作し^ませんでした(つまり、シェルメタキャラクターとはみなされません)。shCentOS(実際にはbash)とshFreeBSD(bashではない)で試しました。他に試すシステムはあまりありません。 この動作は予想されますか?どのシェル^がパイプメタキャラクターと見なされますか?

4
一部のコマンドが標準入力から読み取れないのはなぜですか?
パイプラインをいつ使用すべきなのか、使用すべきでないのはいつだろうか。 たとえば、pdfファイルを処理する特定のプロセスを強制終了するには、パイプラインを使用しても以下は機能しません。 ps aux | grep pdf | awk '{print $2}'|kill 代わりに、次の方法でのみそれを行うことができます。 kill $(ps aux| grep pdf| awk '{print $2}') または ps aux | grep pdf | awk '{print $2}'| xargs kill man bash(バージョン4.1.2)によると: The standard output of command is connected via a pipe to the standard input of command2. …
19 shell  pipe  arguments  stdin 

1
ディスクがいっぱいになるまで、「tar」を「dd」にパイプするのが止まらないのはなぜですか?
単一のディスクイメージのtarアーカイブがあります。このtarファイル内の画像のサイズは約4GBです。Iパイプの出力tar xfにddSDカードにディスクイメージを書き込みます。ディスクダンプは、カードがいっぱいになるまで停止しません。これが私のシェルセッションです。 $ ls -l disk.img.tgz -rw-r--r-- 1 confus confus 192M Okt 5 00:53 $ tar -tvf disk.img.tgz -rw-r--r-- root/root 4294968320 2018-10-05 00:52 disk.img $ lsblk -lb /dev/sdc NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdc 8:32 1 16022241280 0 disk $ tar zxf disk.img.tgz -O | sudo dd status=progress …
18 pipe  tar  dd  disk-image 


2
パイプを使用してbash関数を作成する方法は?
この方法で定義された関数はほとんどありません。 function f { read and process $1 ... echo $result } 呼び出しが次のようになるようにそれらを一緒に作りたいですf | g | h。 引数で機能する関数をstdinからの引数を読み取る1つに変換するために使用するイディオムのシャドーは何ですか?ペアをエスケープする必要なくストリームから引数のタプルを読み取ることは可能ですか?

3
echo vs <<<、またはBash Awardでのechoの無駄な使用?
今ではcat賞の無用使用は非常によく知られており、無用の使用echoについても言及されています(この質問には関係ありません)。「echoバッシュインアワードの役に立たない使用」があるべきかどうか疑問に思っています:非常に非科学的な測定によると、配管はヒアドキュメントとヒアストリングよりもはるかに遅いようです: ヒアドキュメント: for reps in 1 2 3 do time for i in {1..1000} do cat &lt;&lt;'END' test string END done &gt; /dev/null done real 0m1.786s user 0m0.212s sys 0m0.332s real 0m1.817s user 0m0.232s sys 0m0.332s real 0m1.846s user 0m0.256s sys 0m0.320s ヒアストリングス for reps in 1 2 3 do …

3
RPMパッケージをダウンロードして1行でインストールする方法は?
wgetRPMをダウンロードしてそれをパイプでsudo rpm -iインストールし、1行でインストールできるかどうか疑問に思っていました。私はちょうど実行できることを理解しています: wget -c &lt;URL&gt; sudo rpm -i &lt;PACKAGE-NAME&gt;.rpm パッケージをインストールするには 私は使用してみました: wget -cqO- &lt;URL&gt; | sudo rpm -i しかし、それは返されました: rpm: no packages given for install
18 pipe  rpm  wget 

4
stdoutへの出力と同時にファイルへのgrep
テキストをに出力するスクリプトがありますstdout。ターミナルでこのすべての出力を確認し、同時にいくつかの行をフィルタリングしてファイルに保存したいです。例: $ myscript Line A Line B Line C $ myscript | grep -P 'A|C' &gt; out.file $ cat out.file Line A Line C ターミナルで最初のコマンドの出力を確認し、2番目のコマンドの出力をファイルに保存します。同時に。私が使ってみteeて、より良い、ない結果、または逆の結果。
18 grep  pipe  stdout  tee 

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