2017-07-01 148 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