как получить имя терминала Linux

#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;
    }