2017-07-01 10 views
1

私はrubyでciteselectと呼ばれるプログラムを作成しました。このプログラムはcursesを使ってbibtexライブラリから参照を動的に選択します。私は、このプログラムの出力を使って簡単に何かを引用するために、このプログラムをパイプラインに入れたいと思っています。残念ながら、 Ncurses and linux pipeline (c)から見つかったように、 Cursesではstdoutが表示されます。ファイルディスクリプタ3の出力をbashにインラインで挿入する

したがって、出力引用キーが出力として提供されている場合、出力引用キーをファイル記述子3にルーティングしました。私はそれが動作することを確認しました:
citeselect 3>output

はbashで1つのライナーでfd3に送信された出力をキャプチャする方法はありますか?何かのように
echo "The citation key is $(citeselect 3>)"

ありがとう。

+1

もうすぐです。 '3>&1'はファイル記述子3をファイル記述子1(標準出力)にコピーします。 cursesが実際に標準出力に(そして直接端末には書いていない)書き込むならば、それをキャプチャするのを避けるために、いくつかの歪みをまた処理する必要があります。 – chepner

答えて

0

出発点として、出力のリダイレクトと周りの実験後の参照のためにそれを使用しないでくださいいくつかのケースでは、私はおよそ間違った考えを持っていたことに気づいた何のn> &しました。このガイドでは、本当に私を助けた:
http://mywiki.wooledge.org/BashFAQ/002

これを行うには、私はstderrに標準出力をリダイレクトする必要があり、その後、FD3は次のようにstdoutに:
CITATION=$(citeselect 3>&1 1>&2)

その方法は呪いまだのtty経由を使用することが可能ですstderrストリーム、私はまだ引用出力をパイプすることができます。私の以前の試みの多くでは、彼らがしていたことの根本的な誤解のために、リダイレクトの引数を逆にしました。

0

すてきな質問ですが、これを行うもっと良い方法は、stdoutファイル記述子をexecコマンドを使って別の番号に置き換えることです。

あなたの$ {HOME}/binにまたは/ usr/binに/フォルダにこのファイルを置い
#!/usr/bin/env bash 

exec 3>&1 # 1 is stdout 3 is the fd to assign stdout to 


exec > outputfile.txt # every command executed within this location to where the fd was closed and replaced back to it's formal value will be send to outputfile.txt 


citselect 

exec 1>&3 3>&- # the fd of stdout is replaced back to one and it was also reset 

し、それを実行する代わりに、事前bashのガイドをチェックしますが、これについての詳細は、直接

をciteselectを呼び出しますあなたは勝利の答えを使用して

Advance Bash Guide

関連する問題