Как открыть командный терминал в Linux? - PullRequest
7 голосов
/ 28 февраля 2009

Я хочу открыть терминал (командную строку) на компьютере с Linux, используя код Java. Я знаю, как открыть командную строку в 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);

Ответы [ 8 ]

8 голосов
/ 28 февраля 2009

В Linux существует ряд терминальных эмуляторов , которые позволяют вам взаимодействовать с различными оболочками . Каждая оболочка - это, по сути, интерпретатор команд, который понимает команды Linux (команды GNU и Unix более правильные, я полагаю ...). Эмулятор терминала предоставляет интерфейс (окно) для оболочки и некоторые другие средства для использования командной строки. Чтобы открыть окно терминала, вам просто нужно изменить командную строку следующим образом: -

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. Командная строка также может быть изменена для использования различных оболочек, таких как zsh . Я предлагаю вам поймать исключение в случае, если выбранного вами терминала нет, и обработать его, попросив пользователя установить его. Лучшее решение - принять аргументы командной строки для предпочитаемой пользователем оболочки или использовать файл конфигурации, который пользователь может изменить, чтобы ваш скрипт открывал оболочку по своему выбору.

Примечание
1. Как уже отмечали другие, xterm (или любой другой терминал по вашему выбору) может не находиться по указанному пути (/ usr / bin / ...) и даже не быть установленным, поэтому вам, возможно, придется использовать некоторые Необычная командная строка (например: конвейеризация поиска через grep, чтобы получить путь к xterm перед запуском), но это не очень хорошая идея. Я думаю, что лучший способ - позволить пользователю настроить все это.

2. Я получил комментарий к этому ответу (от ypnos), предлагая мне избегать использования абсолютных путей и скорее полагаться на команду, находящуюся в переменной окружения PATH. Я должен сказать, что согласен. В этом случае строка команды должна быть -

String command = "xterm"

Посмотрите на комментарий, потому что он также указывает на проблему с использованием find.

3 голосов
/ 09 июля 2009

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 на и массив строк.

3 голосов
/ 28 февраля 2009

Под Gnome это gnome-terminal.

Под KDE это konsole.

Или вы можете использовать более общую терминальную программу xterm.

Вы, вероятно, захотите использовать опции с большей частью этого, поэтому ищите справочные страницы для той, которую вы хотите.

3 голосов
/ 28 февраля 2009

В Linux нет единой стандартной команды «терминал» - доступные команды зависят от того, какой GUI присутствует (то есть, KDE, Gnome и т. Д.).

Вы должны быть в состоянии полагаться на присутствие xterm, но в современных вариантах Linux это не самый лучший выбор:

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

Конечно, "xterm" не может быть в этом конкретном пути ...

1 голос
/ 28 февраля 2009

Думаю, было бы неплохо, если бы ваше приложение открывало пользовательское терминальное приложение по умолчанию.

К сожалению, кажется, что нет универсального способа определить это.

На мой взгляд, наиболее предпочтительным решением было бы (остановитесь, когда сможете что-нибудь открыть):

  • попытаться определить среду рабочего стола пользователя и определить, что это терминальное приложение по умолчанию. Вы можете прочитать что-нибудь об этом здесь .
  • проверка переменной среды $ TERM
  • Спросите пользователя о его предпочтениях и сохраните его в файле конфигурации.

Определение среды рабочего стола пользователя и его терминала по умолчанию может быть слишком сложным для вашей цели, поэтому я бы использовал два последних варианта. Вы можете запустить приложение из $ TERM с таким кодом:

String command = System.getenv().get("TERM");
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
1 голос
/ 28 февраля 2009

На самом деле нет терминала "the". То, что вы действительно хотите, это оболочка. Большинство Linux использует BaSH как оболочку, но для безопасности вы должны ограничиться / bin / sh

Редактировать: Хм, я, наверное, неправильно понял вопрос. Если вам нужен интерактивный терминал, вам следует использовать инструментарий, предоставляющий для этого компонент.

Edit2: Может быть, VTE, которая является компонентом GTK + для встраивания терминала, может удовлетворить ваши потребности.

0 голосов
/ 01 марта 2009

, поскольку вы должны предположить, что почти ничего не знаете о системе, на которой вы работаете, я бы сказал, что наименьший общий знаменатель будет:

String command = "/ bin / sh";

  • или даже больше «гарантировано» -

String command = "sh";

0 голосов
/ 28 февраля 2009

Я бы определенно предоставил простой способ настройки пути к нужному терминалу в месте, которое можно легко редактировать. Например, может быть в файле конфигурации XML.

Разные дистрибутивы будут хранить это в разных местах, поэтому, вероятно, лучше проверить документацию для каждого дистрибутива для платформ, на которые вы ориентируетесь (и документировать, как их изменить).

"/ usr / bin / xterm" должно быть на большинстве машин, но я не обязательно ставлю на него ферму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...