我在ruby中编写了一个名为citeselect
的程序,该程序使用curses从bibtex bibliogrpahy中动态选择引用。我想把这个程序放到一个管道中,用这个程序的输出很容易地引用任何东西。不幸的是,正如我从中发现的那样
Ncurses and linux pipeline (c),
Curses使用stdout
进行显示。
因此,当输出引用密钥作为输出提供时,我已将输出引用密钥路由到文件描述符3中。我已经证实它有效:
citeselect 3>output
有什么方法可以捕获bash中一行中发送到fd3
的输出?像什么一样的东西
echo "The citation key is $(citeselect 3>)"
感谢。
答案 0 :(得分:1)
以胜利的答案为出发点,在尝试输出重定向后,我意识到我对n>&m;做了什么有错误的想法。本指南真的帮助了我:
http://mywiki.wooledge.org/BashFAQ/002
要做到这一点,我必须将stdout重定向到stderr,然后将fd3重定向到stdout,如下所示:
CITATION=$(citeselect 3>&1 1>&2)
这样curses仍然可以通过stderr流使用tty,而我仍然可以管道引文输出。在我之前的许多尝试中,由于对他们正在做的事情的基本误解,我将重定向参数反转了。
答案 1 :(得分: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 sent to outputfile.txt
citselect
exec 1>&3 3>&- # the fd of stdout is replaced back to 1 and reset
将此文件放入${HOME}/bin
或/usr/bin/
文件夹并执行该文件,而不是直接致电citeselect
有关此问题的详细信息,请查看Advanced Bash Guide,但在某些情况下,您应避免使用该指南作为参考。