2017-07-01 109 views
1

我寫了一個名爲citeselect的ruby程序,它使用curses從bibtex bibliogrpahy中動態選擇參考。我想把這個程序放到一個管道中,用這個程序的輸出很容易地引用任何東西。不幸的是,我發現從 Ncurses and linux pipeline (c), Curses使用stdout來顯示。在bash中插入文件描述符3的輸出

因此,當它作爲輸出提供時,我將輸出引用鍵路由到文件描述符3中。我已經驗證了它的工作原理:
citeselect 3>output

有沒有辦法捕捉到在bash一個班輪發往fd3輸出?類似於
echo "The citation key is $(citeselect 3>)"

謝謝。

+1

你很近。 '3>&1'會將文件描述符3複製到文件描述符1(標準輸出)。如果curses實際寫入標準輸出(而不是直接寫入終端),則還需要進行一些扭曲操作以避免捕獲它。 – chepner

回答

0

用勝利的答案爲出發點,並與輸出重定向各地試驗後,用它做參考,我意識到,我對錯誤的想法是什麼N> &米。本指南真的幫了我:
http://mywiki.wooledge.org/BashFAQ/002

要做到這一點我必須stdout重定向到stderr,然後FD3到stdout這樣的:
CITATION=$(citeselect 3>&1 1>&2)

這樣罵着仍然能夠通過使用TTY stderr流,而我仍然可以管理引文輸出。在我以前的很多嘗試中,我因爲對他們所做的事情存在根本的誤解而使得重新定向的觀點顛倒過來。

0

不錯的問題,更好的方法是使用exec命令將stdout文件描述符替換爲另一個數字。

#!/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 

把這個文件在$ {HOME}/bin中或/ usr/bin中/文件夾,並執行的,而不是調用citeselect直接

,瞭解更多有關這個檢查提前bash的指導,但在某些情況下,你應該避免

Advance Bash Guide