我用ruby编写了一个名为citeselect的程序,它使用诅咒动态地从bibtex目录中选择引用。我想把这个程序放在一个管道里,用这个程序的输出简单地引用任何东西。不幸的是,正如我从Ncurses和linux管道(c)中发现的那样,Curses使用stdout来显示它。
因此,当输出作为输出提供时,我已经将输出引用键路由到文件描述符3中。我已经证实了它是有效的:
citeselect 3>output
有没有办法在bash中的一个班轮中捕获发送给fd3的输出?有点像
echo "The citation key is $(citeselect 3>)"
谢谢。
发布于 2017-07-02 13:03:34
以胜利的答案为起点,在尝试了输出重定向之后,我意识到我对n>&m做了什么有错误的想法。这份指南对我帮助很大:
http://mywiki.wooledge.org/BashFAQ/002
为此,我必须将stdout重定向到stderr,然后将fd3重定向到stdout,如下所示:
CITATION=$(citeselect 3>&1 1>&2)
这样的话,诅咒仍然可以通过stderr流使用tty,而我仍然可以使用引文输出。在我早些时候的许多尝试中,我的重定向论点被推翻了,因为他们对他们所做的事情产生了根本的误解。
发布于 2017-07-01 21:17:08
不错的问题,更好的方法是使用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。
有关这方面的更多信息,请查看高级击打指南,但在某些情况下,您应该避免使用指南作为参考。
https://stackoverflow.com/questions/44865266
复制相似问题