7

我想使用 Java 代码在 Linux 机器上打开终端(命令提示符)。我知道如何在 windows 中打开命令提示符。以下代码我在 windows 中使用过

String command= "cmd c/start cmd.exe"
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

我在 Linux 中需要同样的东西。

感谢您的回答。我也想运行一个 sh 脚本。

以下代码是否有效。

String command= "usr/bin/xterm myshell.sh";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
4

8 回答 8

8

在 Linux 中,有许多终端仿真器允许您与各种shell交互。每个 shell 基本上都是一个理解 Linux 命令的命令解释器(我想 GNU 和 Unix 命令更正确......)。终端仿真器为 shell 和其他一些使用命令提示符的工具提供了一个界面(窗口)。要打开终端窗口,您只需像这样修改命令字符串:-

import java.io.*;

class TerminalLauncher
{
    public static void main(String args[]) throws IOException
    {
        String command= "/usr/bin/xterm"; 
        Runtime rt = Runtime.getRuntime();  
        Process pr = rt.exec(command);
    }
}

我所做的基本假设是您想要打开xterm,它几乎可以在任何系统上使用(当然安装了 X)。您可能想要打开另一个终端仿真器,例如 rxvt、eterm、aterm、gnome-terminal 或 konsole。命令字符串也可以修改为使用不同的 shell,如zsh。如果您选择的终端不存在,我建议您捕获异常并通过要求用户安装它来处理它。更好的解决方案是接受用户首选 shell 的命令行参数,或者使用用户可以更改的配置文件以使您的脚本打开他/她选择的 shell。

注意
1. 正如其他人已经指出的那样,xterm(或您选择的任何其他终端)可能不在指定的路径(/usr/bin/...)中,甚至可能没有安装,因此您可能必须使用一些花哨的命令字符串(例如:在启动之前通过 grep 流水线查找以获取 xterm 的路径),这不是一个好主意。我认为最好的方法是让用户配置整个事情。

2.我得到了关于这个答案的评论(ypnos),建议我避免使用绝对路径,而是依赖于 PATH 环境变量中的命令。我不得不说我同意。在这种情况下,命令字符串应该是 -

String command = "xterm"

一定要看评论,因为它也指出了使用 find 的问题。

于 2009-02-28T12:22:14.963 回答
4

Linux 上没有单一的标准“终端”命令——可用的命令取决于存在的 GUI(即 KDE 或 Gnome 等)。

应该能够依靠xterm在场,但在不是选择终端的现代 Linux 变体上:

String command= "/usr/bin/xterm";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

当然,“xterm”可能不在那个特定的路径中......

于 2009-02-28T12:02:05.310 回答
3

在 Gnome 下,它是gnome-terminal.

在 KDE 下,它是konsole.

或者您可以使用更通用的终端程序xterm

您可能希望在大多数情况下使用选项,因此请查找您想要的手册页。

于 2009-02-28T12:05:03.257 回答
3

xterm很可能在大多数基于 Linux 的操作系统上可用,如果存在,将在路径变量中找到。

因此,您将需要执行以下操作:

try {
    Runtime r = Runtime.getRuntime();
    String myScript = .....
    String[] cmdArray = {"xterm", "-e", myScript + " ; le_exec"};
    r.exec(cmdArray).waitFor();
} catch (InterruptedException ex){
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}

-e选项可用于调用脚本或其他程序,例如:javac。在这种情况下,您将进行如下分配:myScript = "javac"。

" ; le_exec"如果您不希望窗口在执行后立即关闭,您将需要该部分,否则将其丢弃。分号用于分隔命令,而 le_exec 只是一个等待用户按 Enter 键的简单脚本。

但是,如果您的脚本需要参数,那么您需要将 String myScript 替换为字符串数组。

于 2009-07-09T16:33:12.480 回答
1

实际上没有“the”终端。你真正想要的是外壳。大多数 Linux 使用 BaSH 作为 shell,但为了安全起见,您应该将自己限制在 /bin/sh

编辑:嗯,我可能误解了这个问题。如果您想要一个交互式终端,您应该考虑使用为此提供组件的工具包。

Edit2:也许您的需求可以通过 VTE 来满足,它是一个用于嵌入终端的 GTK+ 组件。

于 2009-02-28T12:03:06.523 回答
1

我认为如果您的应用程序将打开用户的默认终端应用程序会很好。

不幸的是,似乎没有通用的方法来确定它。

在我看来,最可取的解决方案是(只要你能打开东西就停下来):

  • 尝试重新识别用户的桌面环境并确定它是默认的终端应用程序。你可以在这里读到一些关于它的东西。
  • 检查环境变量 $TERM
  • 询问用户她的偏好并将其保存在配置文件中。

找出用户的桌面环境和它的默认终端对于您的目的来说可能太复杂了,所以我会使用最后两个选项。您可以使用如下代码从 $TERM 运行应用程序:

String command = System.getenv().get("TERM");
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
于 2009-02-28T12:55:56.443 回答
0

因为你必须假设你对运行它的系统几乎一无所知,所以我想说最小的公分母是:

字符串命令 = "/bin/sh";

  • 甚至更“有保证”——

字符串命令=“sh”;

于 2009-03-01T01:20:25.763 回答
0

我肯定会提供一种简单的方法来在可以轻松编辑的地方配置所需终端的路径。例如,可能在配置 XML 文件中。

不同的发行版会将其保存在不同的位置,因此最好检查您所针对的平台的每个发行版文档(并记录如何更改它)。

“/usr/bin/xterm”应该在大多数机器上,但我不一定会在农场上打赌。

于 2009-02-28T12:32:35.580 回答