在Linux中如何打开命令终端?

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);

你能澄清一下吗?你想打开一个终端还是运行一个脚本?用户有各种不同的终端,你很难保证你可以打开一个。但是运行一个脚本,几乎每个Linux系统都有/bin/sh(只是可能不在绝对路径上)。 - num1
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/...)中,甚至可能未安装,因此您可能需要使用一些花哨的命令字符串(例如:将find通过grep管道传递以获取xterm路径,然后再启动),这不是一个好主意。我认为最好的方法是让用户配置整个过程。 2.我在这个答案(由ypnos提供的评论)中得到了一个建议,建议我避免使用绝对路径,而是依赖于命令在PATH环境变量中。我必须说我同意。在这种情况下,命令字符串应该是 -
String command = "xterm"

请看注释,因为它还指出了使用find的问题。

2
在Linux上运行二进制文件时,不要使用绝对路径。该命令会观察PATH变量。如果你只是在“xterm”上调用它,那么只要系统中存在xterm,它就会被找到。 - ypnos
1
PS:find 是个糟糕的想法。locate 会稍微好一些。whereis 是正确的。但是,要调用 find/locate/whereis,你也必须知道它们的绝对路径;-))……千万不要使用绝对路径,否则会让你发疯:D - ypnos
任何想在某个Unix系统上执行特定工具的程序,绝不应该依赖于用户设置PATH以保证获得所需内容的价值。用户可以自由地根据他们认为最佳的方式来处理他们的PATH,并可以通过在~/bin中使用shell脚本来覆盖任何内容。 - laune
@ypnos 我不知道在一个50多个软件工程师的软件开发环境中提供make文件(依赖于PATH具有相同的破坏性影响)是否是您认为的“边缘情况”。无论如何,一个(通过严格要求)可追踪、可重现和可靠的构建过程是不可能绕过用户设置,如PATH、别名和环境的。 - laune
@ypnos,我只是反对你的无条件陈述“在Linux上不要使用绝对路径来存储二进制文件。”这句话中没有任何限制。 - laune
显示剩余7条评论

4

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

您应该能够依赖xterm,但在现代Linux变体中,它不是首选的终端:

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

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

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键。
但是,如果您的脚本需要参数,则需要将字符串myScript替换为字符串数组。

3
在 Gnome 下,它是 gnome-terminal
在 KDE 下,它是 konsole
或者您可以使用更通用的终端程序 xterm
您可能想要使用大多数选项,因此请查找您想要的那个 man 页面。

1

我认为如果您的应用程序能够打开用户的默认终端应用程序,那将是很好的。

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

在我看来,最好的解决方案是(尽可能停止打开某些东西):

  • 尝试识别用户的桌面环境并确定其默认终端应用程序。 您可以在这里阅读有关此内容的信息。
  • 检查环境变量$TERM
  • 询问用户她的偏好并将其保存在配置文件中。

找出用户的桌面环境及其默认终端可能对您的目的过于复杂,因此我建议使用后两个选项。 您可以使用以下代码从$TERM运行应用程序:

String command = System.getenv().get("TERM");
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

我没有想到使用$TERM。无论如何,我知道它并不总是准确的。根据您提供的链接,gnome-terminal和konsole都将其设置为xterm。 - batbrat
没错,TERM 不是用来保存二进制文件名的,而是一个可以在 /etc/termcap 中查找的名称。gnome-terminal 和 xfce-terminal 都使用 "xterm"。当运行 screen 会话时,它是 "screen"。 - Joachim Sauer
此外,如果有人从桌面启动Java应用程序,则TERM很可能是启动X和整个会话的真实虚拟控制台。 - ypnos

1

实际上没有所谓的“the”终端。你真正想要的是shell。大多数Linux使用BaSH作为shell,但为了保险起见,你应该限制自己在/bin/sh下操作。

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

编辑2:也许VTE可以满足你的需求,它是一个GTK+组件,可用于嵌入终端。


0

我一定会提供一种简单的方法来配置路径到所需终端,这个地方可以很容易地进行编辑。例如,可能在一个配置XML文件中。

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

"/usr/bin/xterm" 应该在大多数机器上都有,但我不会完全相信它。


0

由于您必须假设自己几乎不知道正在运行的系统,因此我会说最低公共分母是:

String command = "/bin/sh";

  • 甚至更加“保险”的是 -

String command = "sh";


这不会启动终端模拟器,只会启动一个 shell。 你还应该使用 '/bin/sh' 而不是 '/usr/bin/sh',因为前者是 POSIX 的要求(即保证在每个 Unix 系统中都存在)。 - Kristof Provost
楼主说:我想打开终端(命令提示符),所以他们不想要一个终端仿真器 - 但是我同意关于 /usr/bin/sh 的观点(因此已经编辑)。 - KevinDTimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接