如何 pipe/redirect NCurse 命令的最终标准输出?
How to pipe/redirect the final stdout of a NCurse command?
我有一个显示 Ncurses 内容的命令(initscr
、printw
、addch
、...)。没关系。
最后(endwin
),我想“输出”(std::cout << "some string"
)一个字符串以供其他命令处理(或者可能重定向到流)。
我想要做这样的事情:
my-ncurse-command | any-other-command
my-ncurse-command > some-stream
问题是:我的 ncurses 显示被管道或重定向捕获,而不仅仅是最终字符串。
有没有办法允许这样做?
谢谢。
而不是 initscr()
,使用 newterm()
。如果您已经在使用 newterm
,只需提供与 stdout
.
不同的输出流即可
initscr()
等同于:
#include <cstdlib>
WINDOW* myinitscr() {
newterm(getenv("TERM"), stdout, stdin);
return stdscr;
}
所以
#include <cstdio>
#include <cstdlib>
std::FILE* cursesout{};
WINDOW* myinitscr() {
cursesout = std::fopen("/dev/tty", "w"); // open new stream to your terminal
if(cursesout) newterm(std::getenv("TERM"), cursesout, stdin);
return stdscr;
}
和endwin()
之后:
std::fclose(cursesout);
或者,使用智能指针不必手动 std::fclose
新的输出流:
#include <cstdio>
#include <cstdlib>
#include <memory>
using FILE_ptr = std::unique_ptr<FILE, decltype(&std::fclose)>;
FILE_ptr cursesout{nullptr, nullptr};
WINDOW* myinitscr() {
cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), &std::fclose);
if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
return stdscr;
}
不使用标准库函数地址的版本(这是被严格禁止的)可能如下所示:
#include <cstdio>
#include <cstdlib>
#include <memory>
using FILE_ptr = std::unique_ptr<FILE, void (*)(FILE*)>;
FILE_ptr cursesout{nullptr, nullptr};
WINDOW* myinitscr() {
cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), [](FILE* fp) {
std::fclose(fp);
});
if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
return stdscr;
}
我有一个显示 Ncurses 内容的命令(initscr
、printw
、addch
、...)。没关系。
最后(endwin
),我想“输出”(std::cout << "some string"
)一个字符串以供其他命令处理(或者可能重定向到流)。
我想要做这样的事情:
my-ncurse-command | any-other-command
my-ncurse-command > some-stream
问题是:我的 ncurses 显示被管道或重定向捕获,而不仅仅是最终字符串。
有没有办法允许这样做? 谢谢。
而不是 initscr()
,使用 newterm()
。如果您已经在使用 newterm
,只需提供与 stdout
.
initscr()
等同于:
#include <cstdlib>
WINDOW* myinitscr() {
newterm(getenv("TERM"), stdout, stdin);
return stdscr;
}
所以
#include <cstdio>
#include <cstdlib>
std::FILE* cursesout{};
WINDOW* myinitscr() {
cursesout = std::fopen("/dev/tty", "w"); // open new stream to your terminal
if(cursesout) newterm(std::getenv("TERM"), cursesout, stdin);
return stdscr;
}
和endwin()
之后:
std::fclose(cursesout);
或者,使用智能指针不必手动 std::fclose
新的输出流:
#include <cstdio>
#include <cstdlib>
#include <memory>
using FILE_ptr = std::unique_ptr<FILE, decltype(&std::fclose)>;
FILE_ptr cursesout{nullptr, nullptr};
WINDOW* myinitscr() {
cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), &std::fclose);
if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
return stdscr;
}
不使用标准库函数地址的版本(这是被严格禁止的)可能如下所示:
#include <cstdio>
#include <cstdlib>
#include <memory>
using FILE_ptr = std::unique_ptr<FILE, void (*)(FILE*)>;
FILE_ptr cursesout{nullptr, nullptr};
WINDOW* myinitscr() {
cursesout = FILE_ptr(std::fopen("/dev/tty", "w"), [](FILE* fp) {
std::fclose(fp);
});
if(cursesout) newterm(std::getenv("TERM"), cursesout.get(), stdin);
return stdscr;
}