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

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

4
apt-cacheポリシーの出力がパイプされないのはなぜですか?
理由がわからない $ apt-cache policy foo N: Unable to locate package foo だが $ apt-cache policy foo 2&gt;&amp;1 | grep . 空です。 後者の呼び出しのどこで間違った仮定をしていますか? 元のタスク:apt-cache policyおそらく出力を処理する必要があります:-) UPD: foo私の例で使用されているものは、インデックスに存在しないパッケージ名に置き換えることができますapt-get。 UPD 2: 回避策のある答えがあります。ソリューションが機能しない+50理由を説明した人には、追加の報奨金が授与され2&gt;&amp;1ます。
12 shell  apt  pipe 

2
名前付きパイプの戻り値に対するseek()操作を成功させることは可能ですか?
プログラムseek()が名前付きパイプで操作を実行しようとすると、「違法シーク」の代わりに成功します(ただし、パイプが空のファイルであるかのように振る舞う)ようにする方法はありますか? 私のシステムの最後の少しのログはSQLiteデータベースに保存されており、どこにもファイルはありません。ただし、これに問題があるプログラムがいくつかあります。2つの特定のケースがあります。 プログラムは、syslog-ngが名前付きパイプとして作成して読み取り中のログファイルに書き込みたいと考えています。プログラムはseek()何らかの理由でaを実行したいのに失敗します。 プログラム(denyhostsやfail2banなど)は、syslog-ngが名前付きパイプとして作成して書き込み中のログファイルから読み取りたいと考えています。プログラムはそれを実行しようとしてseek()失敗します。 理想的には、これらのシークが名前付きパイプが単なる空のファイルであるかのように動作するようにしたいのです。とにかく、ログを書き込むプログラムがシークを実行する必要がある理由がわかりません。追加のためにファイルを開いて書き込みを開始するだけです。プログラムの読み取りが最後の位置から再開できるように、プログラム読み取りがシークしたい理由がわかります。したがって、ファイルが空のように(切り捨てられたように)動作するようにします。 名前付きパイプにこのように動作させるために設定できるオプションがありますか?そうでない場合、syslog-ngがパイプを開いてこのように動作させるときに設定できるモードはありますか?それとも、私は小川を上がっていますか?
12 pipe  syslog 

3
パイプラインをファイルの終わりまで待機させるか、エラー後に停止させる方法は?
パイプシェナンガンに関するこのビデオを見て、次のコマンドを試しました。 man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura - それは基本的にユーザーがそれらの1つを選択するためにdmenuにマンページのリストを印刷し、次にxargsを使用して実行しman -Tpdf %(xargsの入力からgitのマンページのpdfを標準出力して)、pdfリーダーにPDFを渡します(zathura )。 問題は、(ビデオで見られるように)dmenuで1つのマンページを選択する前でもpdfリーダーが起動することです。Escをクリックしてnoneを選択すると、pdfリーダーは開いたままで、ドキュメントがまったく表示されません。 入力がファイルの終わりに達したとき、または入力をまったく受け取ったときにのみPDFリーダー(およびパイプチェーン内の他のコマンド)を実行するにはどうすればよいですか?または、チェーンされたコマンドのいずれかがゼロ以外の終了ステータスを返した後にパイプチェーンを停止するにはどうすればよいですか(dmenuがオプションを選択しないためのエラーを返す場合、次のコマンドは実行されません)?

2
読み取りと書き込みの両方にstderrを使用する方法(およびその理由)
よるシリーによってこの答え、lessそれは開くことができない場合は標準エラー出力からのナビゲーションコマンドを読み込みます/dev/tty。 他のプログラムのstderrストリームに書き込むものを見たことがないので、これは不可解なように見えます。 stderrが読み取りと書き込みの両方に対してオープンであることの目的は何ですか?そして、これが便利な場合、現代のシステムでどのように利用するのですか?(たとえば、stdinの代わりにstderrに何かをパイプする難解な構文はありますか?)
12 pipe  stderr 

1
Linuxの「漏れやすい」パイプ
次のようなパイプラインがあるとします。 $ a | b bstdinの処理を停止した場合、しばらくしてからパイプがいっぱいになり、astdoutへの書き込みがブロックされます(b処理が再開されるか、終了するまで)。 これを回避したい場合は、次のように大きなパイプ(または、もっと簡単に言うとbuffer(1))を使用したくなるかもしれません。 $ a | buffer | b これは単に私にもっと時間を買ってくれるでしょう、しかしa結局結局止まるでしょう。 (私が取り組んでいる非常に具体的なシナリオの場合)欲しいのは、「リークの多い」パイプを使用して、いっぱいになるとバッファからデータを(理想的には行ごとに)ドロップしてa続行できるようにすることです処理(おそらくご想像のとおり、パイプを流れるデータは使い捨てです。つまり、データを処理することは、ブロックなしで実行できることbほど重要ではありませんa)。 要約すると、境界のある、リーキーなバッファのようなものが欲しいです: $ a | leakybuffer | b おそらくどの言語でも簡単に実装できますが、「すぐに使える」もの(またはbashの1行のようなもの)がないのではないかと思っていました。 注:例では通常のパイプを使用していますが、質問は名前付きパイプにも同様に適用されます 私は以下の回答を授与しましたが、以下の簡単なソリューションにはいくつかの制限があったため、leakybufferコマンドを実装することも決定しました:https : //github.com/CAFxX/leakybuffer
12 linux  pipe  fifo  buffer 

2
パイプ(|)を変数に格納する方法は?
アイデアは、それを...コマンドのパイプとして使用することです。たとえば、何度もタイプし直さなければならないある種の長いパスがあり、その後にパイプと2番目のプログラムが続くとします。 "directory1/directory2/direcotry3/file.dat | less -I " その部分を変数に格納したいので、次のように使用できます。 r="directory1/directory2/direcotry3 \| less -I -p " $ cat path1/path2/$r &lt;searchterm&gt; 代わりに、私は得る cat: invalid option -- I Try `cat --help' for more information. ...パイプが明らかに機能しなかったことを意味します。
12 bash  pipe  variable 

4
netcatが応答を出力しない
私が使用してTCPポートにコマンドを送信しようとしているnetcatとのパイプ応答 、私が実行したときnetcat、それは正しく応答を出力しますが、私はパイプからコマンドを渡すとき、それは正確にコマンドを送信しますが、応答が印刷されない、私のコマンドを入力します。 したがって、これは正しく動作します: netcat localhost 9009 これはコマンドを送信するだけですが、応答を出力しません。 echo 'my_command' | netcat localhost 9009 どうして?応答テキストを印刷 するnetcatにはどうすればよいですか?
12 pipe  netcat 

5
「検索」コマンドで見つかったファイルを開く
これはおそらく簡単なものですが、理解できず、ほとんど検索できません。フォルダー階層には、タイプxyzのファイルが1つだけあります。そのファイルを見つけて、ターミナルコマンドで開きたいのですが。 find . -name *.xyz これにより、探しているファイルが返されます。名前を入力せずに自動的に開くにはどうすればよいですか? find . -name *xyz | open これは機能しません。openコマンドが見つからなかったと表示されます。
12 linux  terminal  find  pipe 

2
このbashパイプ構造を使用すると、なぜデータが失われたように見えるのですか?
私はそのようないくつかのプログラムを組み合わせようとしています(余分なインクルードは無視してください、これは進行中の重い作業です): pv -q -l -L 1 &lt; input.csv | ./repeat &lt;(nc "host" 1234) 繰り返しプログラムのソースは次のようになります。 #include &lt;fcntl.h&gt; #include &lt;stdint.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;sys/epoll.h&gt; #include &lt;sys/stat.h&gt; #include &lt;sys/types.h&gt; #include &lt;unistd.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; inline std::string readline(int fd, const size_t len, const char delim = '\n') { std::string …

6
半非同期パイプ
次のパイプがあると仮定します。 a | b | c | d cまたはで(またはb)の完了を待つにはどうすればshよいbashですか?つまり、スクリプトdはいつでも開始できますが(待機する必要はありません)、からの完全な出力がc正しく機能する必要があります。 ユースケースは、画像を比較するdifftoolためのgitものです。これは呼び出されgit、その入力(a | b | cパート)を処理して、比較の結果(パート)を表示する必要がありますd。呼び出し元は、aおよびに必要な入力を削除しますb。つまり、スクリプトから戻る前に、プロセスc(またはb)を終了する必要があります。一方、dユーザーの入力を待っているので、待つことができません。 結果をc一時ファイルに書き込んだり、FIFOをで使用したりできることはわかっていますbash。(ただし、FIFOが役立つかどうかはわかりません。)一時ファイルなしでこれを実現することは可能shですか? 編集 おそらく、信頼できる方法でc(またはb)プロセスのプロセスIDを見つけることができれば十分でしょう。次に、パイプ全体を非同期で開始し、プロセスIDを待つことができます。の線に沿った何か wait $(a | b | { c &amp; [print PID of c] ; } | d) 編集^ 2 私は解決策を見つけました、コメント(またはより良い解決策)は大歓迎です。
11 bash  shell  pipe  fifo 

2
ループ出力のパイピングは、ローカル変数の変更を防ぎます
私は、引数として多数のファイルやディレクトリを受け取る単純なbash関数を記述しようとしています。そうすべき: ファイル名を完全に修飾します。 それらを並べ替えます。 重複を削除します。 実際に存在するものをすべて印刷します。 存在しないファイルの数を返します。 私はほとんど私がやりたいことをするスクリプトを持っていますが、ソートに落ちます。現状のスクリプトの戻り値は正しいですが、出力は正しくありません(ソートされておらず、重複しています)。| sort -u示されているようにステートメントのコメントを外すと、出力は正しくなりますが、戻り値は常にになり0ます。 NB問題を解決するためのよりシンプルなソリューションは歓迎されますが、問題は、なぜこれが私が持っているコードで発生するのかについてです。つまり、パイプを追加すると、スクリプトが変数をインクリメントするように見えるのはなぜrですか? スクリプトは次のとおりです。 function uniqfile { local r=0 for arg in "$@" do readlink -e "$arg" || (( ++r )) done #| sort -u ## remove that comment return $r }

2
パイプバッファーがいっぱいであるかどうかを確認するにはどうすればよいですか?
1つのプログラムからの出力を、私が書いたいくつかのPerlにパイプしています。これは長時間実行されるプロセスであり、場合によっては数日かかるため、ボトルネックがどこにあるかを調べて、それらを開こうとする必要があります。スクリプトが処理できるよりも速くデータがスクリプトにパイプ処理されているかどうかを知りたいのですが。これが当てはまる場合は、スクリプトを調整しようとしますが、必要がない場合は調整しません。バッファがいっぱいになるとフラグが設定され、それ以上の書き込みができなくなるという話がありましたが、そのフラグが設定されているかどうか、またはどのくらいの頻度で設定されているかを確認するにはどうすればよいですか?何か案は?
11 pipe 

2
stdinとコマンドライン引数のパフォーマンスの違い
一部のコマンドでは、特定の入力をstdinまたはコマンドライン引数として指定できます。 具体的には、仮定commandのコマンドライン引数としてstdinを入力し、ファイル名を取ることができ、かつcommand &lt; myfile、cat myfile | command とcommand myfile同じ結果を生成することができます。 例えば、 コマンドがsed次の場合: sed s/day/night/ &lt;myfile &gt;new sed s/day/night/ myfile &gt;new cat myfile | sed s/day/night/ &gt;new コマンドがcat次の場合: cat &lt; myfile cat myfile 彼らのパフォーマンスについていくつかの一般的なルールがあるかどうか疑問に思っていました。 リダイレクトは常にパイプよりも優れていますか?

1
tty出力を持つ変数コマンドでstdinとstdoutをパイプするとき、zshは端末に入力できません
システム情報: macOS Sierra 10.12.6 zsh 5.4.2 (x86_64-apple-darwin16.7.0) GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) 私が作成した簡単な例を詳しく知りたい場合は、一番下の「例」までスクロールしてください。 注:私は大したzshユーザーではありません。 私は見ていたfzfためにキーバインドbashとzsh。 どちらも変数コマンドを実行する方法に注意してください$(__fzfcmd)。__fzfcmdデフォルトでfzfはstdoutに出力し、パラメーター置換fzfは出力から得られたコマンド()を実行するだけです。 間の一つの違いbashとzshスクリプトがあることbashつの更なるパイプの出力は$(__fzfcmd)なく、zsh単に配列の内部に取り込みます。私の推測では、入力できない場所zshの出力をさらにパイプfzfするfzfと、パイプされたプロセスがfzfstdinを取得できないという問題が発生したためです。あなたの唯一の選択は、^Zまたは^Cです。^Cなんらかの理由でプロセスの背景になっているようです。または、多分彼らはそれを実行zle vi-fetch-historyすることができるように配列でそれを望んだだけです。bashバージョンは、との結合キーにいくつかの魔法を行います"\e^": history-expand-line 今fzfは重要ではありません。ttyこの問題を発生させるには、パラメータ置換によって呼び出されるに出力するプログラムが必要なだけのようです。そこで、いくつかの簡単な例を示します。 でttyこの問題を引き起こす可能性のあるに出力される他のいくつかのコマンドを次に示しますzsh。 vipe(パイプの途中でエディターを実行) 'vim -' (vimをstdinから読み取ります。vipeと同様ですが、stdoutに出力されません) 以下の例で、個別にインストールしたくない場合は、vipeをすべてで置き換えてvim -ください。ただ、それは覚えているvim -ような標準出力に出力し、エディタの内容をしませんvipeありません。 例: 1) echo 1 | vipe | cat # works in both bash and zsh 2) echo 1 | $(echo vipe) | …
11 bash  zsh  pipe  tty 

4
コマンドのバックグラウンドでパイプされたシーケンス内の任意のコマンドのPIDを取得します
でbash、私が実行すると: cmd1 | cmd2 | ... | cmdi | ... | cmdn &amp; どこcmd{1..n}明瞭ではないかもしれないが、どのように私はのPIDを得るのですかcmdi?または、cmdiプロセスにどのように通知できますか?(例えば、それを送信SIGUSR1?) pkill/ pgrep、pidofなどの良い答えのように見ていない、の他のインスタンスので、cmdi多分、実行している同じパイプラインの一部として含みます。jobs -pのPID cmd1を私に与えます。 iの何でもかまいません{1..n}。
11 bash  shell  pipe  job-control 

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