在bash中内联插入文件描述符3的输出

时间:2017-07-01 20:45:05

标签: bash file-descriptor output-redirect

我在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>)"

感谢。

2 个答案:

答案 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,但在某些情况下,您应避免使用该指南作为参考。