【问题标题】:How do I start a terminal instance from a compiled rust executable?如何从已编译的 Rust 可执行文件启动终端实例?
【发布时间】:2023-01-26 11:55:41
【问题描述】:

我正在制作一个小型项目,该项目从一个包含 101 个项目的文件中读取,创建一个字符串向量,然后随机访问其中一个项目并将其打印到标准输出。从终端运行时,无论是通过cargo run,该程序都完全按照预期运行 或者通过使用 ./executable_name 从终端运行可执行文件。问题是,如果我在没有打开终端的情况下双击可执行文件,则没有地方可以打印信息,程序基本上是无用的。我知道如何使用检查终端是否打开

if atty::is(Stream::Stdout) {
    println!("Already in terminal");
    } else {
    // this is where I get confused
    }   

但从那里我不知道去哪里。我已经尝试过Command::new("sh");之类的东西,但我正在努力处理文档。最终,我的想法是我可以在我的合作伙伴 Mac 上编译它,而不会像我在 Linux 上编写它时那样失去它的功能,并创建一个易于使用的应用程序来在她的机器上运行它。

【问题讨论】:

  • 制作一个终端应用程序,它可以工作一个终端,很好。如果你想做一个GUI应用,也就是不需要终端的应用,也可以。但这些是不同的东西。我的观点是:如果你是做终端应用,那么只做一个终端应用是可以的。从终端运行它取决于用户。
  • 这不是特定于 Rust 的问题,更像是一个一般的命令行问题。无论我认为哪种语言,解决方案都应该是相同的。然而,影响答案的是操作系统。您真正想要做的是将您的操作系统配置为在双击该应用程序时打开一个虚拟终端。我不认为你的程序会负责这样做......
  • 所以我认为你的问题应该是:“为什么 Mac 不在虚拟终端中启动我的应用程序”?

标签: rust stdout


【解决方案1】:

程序一般不会打开自己的终端窗口。您安排一个存在的方式因平台而异:

  • 在 macOS 上,您实际上什么都不用做;双击可执行文件的默认行为是打开一个终端来运行它。(GUI 应用程序在.app 包中有它们的可执行文件,因此这种行为不适用于它们。)

  • 在 Windows 上,是否打开终端是可执行文件的一个属性,您可以在 Rust 中使用 the windows_subsystem attribute 设置它。但是,默认值为console,因此您无需执行任何操作。

  • 在 Linux 上,您将创建指定 Terminal=truea .desktop file,以请求桌面环境在终端中启动您的程序,然后双击该文件而不是可执行文件。或者,你可以让你的程序启动终端模拟器并指示它在自身内部再次启动您的程序,但是您如何执行此操作将取决于安装了哪些终端仿真程序。

对于所有这些情况,您必须做的一件事是向您的程序添加“按 Enter 退出”提示。否则,终端将在您的程序退出后立即关闭,因此您的输出将不可见。

eprintln!("Press Enter to exit.");
std::io::stdin().read_line(&mut String::new()).unwrap();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多