TL; DR: Для этого нет стандартизированного API, и вы не можете быть уверены, что в дистрибутиве указано приложение терминала.
Прежде всего, XTerm, Mate's Terminal, Konsole и т. Д. все разные приложения. А поскольку Ubuntu Mate под капотом сообщает как Ubuntu, AFAIK, вы даже не можете быть уверены, что это приложение зарегистрировано как «терминальное» приложение. Кроме того, почти в каждой среде рабочего стола имеется свое собственное терминальное приложение, и, поскольку вы можете устанавливать несколько терминальных приложений рядом, самое умное предположение - автоматически выбирать «подходящее» терминальное приложение.
Однако, естьСуществует несколько подходов, которые можно рассмотреть для решения этой (эстетической) проблемы:
- Пусть пользователь сам решит, какое терминальное приложение ему нужно. Если у вашего приложения есть файл конфигурации, вы можетеиспользуйте это, чтобы записать значение, указанное пользователем, и принять это как приложение терминала. Теоретически, они могли бы указать путь к приложению, которое не является терминальным приложением, но в этом их вина.
- Составить список известных терминальных приложений и проверить, установлены ли они. Например, вы можете составить (упорядоченный) список приложений, которые должно искать ваше приложение, и, если ни одно из них не будет найдено, вернитесь к XTerm (потому что он установлен на большинстве, если не на всех настольных системах, работающих под управлением Linux). Чтобы увидеть, установлено ли приложение и работает ли оно в Linux, вы можете использовать команду
which
. Пример:
const { spawnSync } = require ("child_process");
const terms = [ "konsole", "mate-terminal", "gnome-terminal" /* ... */ ];
var terminal = null;
// In your startup method (e.g. before opening a BrowserWindow)
if (os.platform () === "linux") {
for (term in terms) {
which = spawnSync ("which", [term]);
if (which.status !== null && which.status === 0) { // Command found
terminal = term;
break;
}
}
if (terminal === null) terminal = "xterm";
} else {
terminal = "cmd";
}
Конечно, вы также можете использовать spawn
в пользу spawnSync
, но это будет более сложным. Кроме того, это дает вам только первое приложение, которое будет установлено, но не выбирает «подходящее» для среды рабочего стола. Но я полагаю, что это хороший шаг в правильном направлении, если вы хотите, чтобы ваше приложение (как-то) казалось бы интегрировано в DE.
В качестве примечания: ваш код не учитывает MacOS, но этоТакже можно открыть терминал на MacOS, он там просто называется «Терминал».