#java #linux #terminal #command
#java #linux #терминал #команда
Вопрос:
Я хочу выполнить команду с терминалом в Linux. Теперь, чтобы сделать это, я не могу жестко закодировать cmd, как я делаю Windows. Как мне получить имя терминала программно в виде строки из java?
new ProcessBuilder(new String[] {"xfce4-terminal", "--title=" windowTitle, "--hold", "-x", "java", "-jar", decodedPath, "run"}).start();
Обратите внимание на строку «xfce4-terminal». Это меняется в зависимости от того, какой дистрибутив Linux у них есть. Какой надежный способ получить exe-файл терминала для команд Java. На мой взгляд, это должно быть с помощью System.getProperty(«os.terminal»), но этого не существует.
Комментарии:
1. Вы пробовали что-то более похожее dzone.com/articles/execute-shell-command-java ?
2. В любом дистрибутиве может быть установлено несколько. Возможно, у вас есть список настроек, в том числе
xterm
по умолчанию3. @FabienMIFSUD Я рассматривал это как вариант, но в нем слишком много данных, мне нужно только имя терминала ОС и надежно получить его.
4. @stark у всех Linux есть xterm? Мне нужно открыть терминал в новом окне и выполнить команду.
5. Не гарантируется.
Ответ №1:
вот кроссплатформенный способ определения терминала ОС. поддерживает Windows, Mac и Linux
public static String osName = System.getProperty("os.name");
public static String[] windows_terminals = new String[]
{
"cmd",
"powershell",//seems to freak out and seems to be beta even in 2020 with all it's bugs
};
public static String[] mac_terminals = new String[]
{
"bin/bash"
};
public static String[] linux_terminals = new String[]
{
"/usr/bin/gcm-calibrate",
"/usr/bin/gnome-terminal",
"/usr/bin/mosh-client",
"/usr/bin/mosh-server",
"/usr/bin/mrxvt",
"/usr/bin/mrxvt-full",
"/usr/bin/roxterm",
"/usr/bin/rxvt-unicode",
"/usr/bin/urxvt",
"/usr/bin/urxvtd",
"/usr/bin/vinagre",
"/usr/bin/x-terminal-emulator",
"/usr/bin/xfce4-terminal",
"/usr/bin/xterm",
"/usr/bin/aterm",
"/usr/bin/guake",
"/usr/bin/Kuake",
"/usr/bin/rxvt",
"/usr/bin/rxvt-unicode",
"/usr/bin/Terminator",
"/usr/bin/Terminology",
"/usr/bin/tilda",
"/usr/bin/wterm",
"/usr/bin/Yakuake",
"/usr/bin/Eterm",
"/usr/bin/gnome-terminal.wrapper",
"/usr/bin/koi8rxterm",
"/usr/bin/konsole",
"/usr/bin/lxterm",
"/usr/bin/mlterm",
"/usr/bin/mrxvt-full",
"/usr/bin/roxterm",
"/usr/bin/rxvt-xpm",
"/usr/bin/rxvt-xterm",
"/usr/bin/urxvt",
"/usr/bin/uxterm",
"/usr/bin/xfce4-terminal.wrapper",
"/usr/bin/xterm",
"/usr/bin/xvt"
};
public static String getTerminal()
{
String[] cmds = getTerminals(osName);
for(String cmd : cmds)
{
try
{
Runtime.getRuntime().exec(cmd " cd " System.getProperty("user.dir"));
return cmd;
}
catch (Throwable e) {}
}
return null;
}
public static String[] getTerminals(String os)
{
return os.contains("windows") ? windows_terminals : os.contains("mac") ? mac_terminals : os.contains("linux") ? linux_terminals : null;
}