Вставка вывода файлового дескриптора 3 inline в bash

Я написал программу на ruby ​​под названием citeselect который использует проклятия для динамического выбора ссылки из библиографической библиографии. Я хотел бы поместить эту программу в конвейер, чтобы легко цитировать что-либо, используя выходные данные этой программы. К сожалению, как я узнал из Ncurses и Linux-конвейера (c), Curses использует stdout для его отображения.

Поэтому я направил выходной ключ цитирования в файловый дескриптор 3, когда он предоставляется в качестве вывода. Я проверил, что это работает:
citeselect 3>output

Есть ли способ захватить вывод, отправленный на fd3 в один лайнер в bash? Что-то вроде
echo "The citation key is $(citeselect 3>)"

Благодарю.

2 ответа

Решение

Используя ответ Victory в качестве отправной точки, и после экспериментов с перенаправлением вывода я понял, что у меня неверное представление о том, что сделал n>&m. Это руководство действительно помогло мне:
http://mywiki.wooledge.org/BashFAQ/002

Для этого я должен перенаправить стандартный вывод в стандартный поток ошибок, а затем fd3 в стандартный вывод следующим образом:
CITATION=$(citeselect 3>&1 1>&2)

Таким образом, curses по-прежнему может использовать tty через поток stderr, в то время как я все еще могу передать вывод цитаты. Во многих моих более ранних попытках аргументы перенаправления менялись на противоположные из-за фундаментального недопонимания того, что они делали.

Хороший вопрос, гораздо лучший способ сделать это - заменить дескриптор файла stdout другим числом, используя exec команда:

#!/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, но в некоторых случаях вам следует избегать использования этого руководства для справки.

Другие вопросы по тегам