【问题标题】:Linux - Open terminal for input/outputLinux - 输入/输出的开放终端
【发布时间】:2022-01-18 07:32:42
【问题描述】:

我正在编写一个 Rust 应用程序,因为它相当小,而且似乎没有任何稳定的 UI 框架,所以我使用 println! 和诸如此类的输入/输出使其在控制台中运行。但是,由于该程序旨在供人们在从 Internet 下载后直接使用(由于其用例),他们可能只是双击它,而不是导航到终端中的下载目录并从那里运行它.

这是一个问题,因为在 Linux 上,它在后台运行,等待输入,看起来好像不起作用。在 Windows 上,Rust 程序默认在 CMD 中打开。 (事实上​​,我的问题的许多搜索结果都是关于禁用这种行为 - 与我想要的完全相反!)。

那么有没有可能以某种方式让我的应用程序在系统的默认终端中打开?我首选的方法是以某种方式嵌入可执行文件以在终端中打开(类似于 MinGW 上的-mconsole 编译器标志)。否则是否有可能检测到它在后台并将其分叉到终端中?如果这不可能,那么是否至少可以检测到应用程序没有在终端中运行并抛出一个消息框告诉用户在终端中运行?

我的应用是跨平台的,但我可以在一个操作系统上编写有条件编译的代码。

【问题讨论】:

  • 如果 GUI 是您的用例的一个选项,您可以使用 fltk,“一个可以静态链接以生成小型、自包含(无外部依赖项)和快速 gui 应用程序”。
  • isn't 确实是一种跨发行版生成终端的方式。虽然老实说,我不会担心。对于初学者来说,我猜想在终端中工作对于 Linux 用户来说更像是一种规则而不是例外。如果您的“应用程序”在其描述中写有“CLI 工具”以及显示终端的使用屏幕截图,那么人们就会明白。

标签: linux rust terminal io


【解决方案1】:

一种典型的方法是将program.sh 与您的可执行文件一起分发。如果.sh 扩展绑定到在他们选择的窗口管理器中打开终端,它将自动打开。如果没有 - 从 shell 运行它就足够了。

没有这个文件你可以:

  1. 检测程序是否已经在终端内运行可以使用isatty() 完成。有一个crate for it
  2. 如果没有,请生成终端应用程序进程 (see process::Command) 并通过将其路径传递给终端命令行选项来重新启动程序。正如@Caesar 提到的,有一堆流行的终端,您可能想检查它们在 Linux 上的存在。如果没有找到任何东西,xterm 有时可能是一个后备。

【讨论】:

  • 谢谢。我最终遵循了你的想法,但如果没有找到终端,我也会使用notify-send 创建一个警报。
  • 给未来观众的提示:这最终比最初听起来更困难,因为所有终端都有不同的执行命令的方法,当我尝试打开时有些(如 gnome-terminal)崩溃了他们通过 rust 命令。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2011-01-13
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多