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