Создайте файл.desktop, который откроется и выполните команду в терминале.

Я хотел бы знать, как написать Exec команда файла.desktop, чтобы открыть новый терминал и выполнить в нем скрипт оболочки. Скрипт оболочки работает и доступен всем пользователям. При запуске скрипта из терминала все работает, но не при попытке запустить скрипт из файла.desktop.

Вот несколько комбинаций, которые я уже пробовал:

Exec=gnome-terminal -x sh -c 'echo hello'
Exec=sh -c 'gnome-terminal echo hello'
Exec=sh -c 'echo hello'
Exec=echo hello

Опция терминала.desktop установлена ​​в значение true.

4 ответа

Решение

Содержимое файла рабочего стола должно выглядеть следующим образом (см., Как создать файл.desktop с помощью текстового редактора):

[Desktop Entry]
Version=1.0
Name=Test        
Comment=Test the terminal running a command inside it
Exec=gnome-terminal -e "bash -c 'echo hello;$SHELL'"
Icon=utilities-terminal
Terminal=false
Type=Application
Categories=Application;

Или же:

[Desktop Entry]
Version=1.0
Name=Test        
Comment=Test the terminal running a command inside it
Exec=bash -c 'echo hello;$SHELL'
Icon=utilities-terminal
Terminal=true 
Type=Application
Categories=Application;

В первом случае Terminal поле установлено в false (возможно, вопреки вашим ожиданиям) и во втором случае устанавливается на true, но результат в обоих случаях одинаков.

TL;DR

[Desktop Entry]
Version=1.0
Name=Hello
Exec=sh -c 'echo hello; $SHELL'
Icon=utilities-terminal
Terminal=true
Type=Application

Как указано в спецификации настольного компьютера,Terminal=trueсообщает программе запуска запустить ваш скрипт в окне терминала. Выбор эмулятора терминала зависит от настроек приложений по умолчанию и среды рабочего стола. В GNOME это gnome-terminal, в KDE - Konsole. (Без DE в простой WM есть ошибка в xdg-open, иTerminal=trueпросто игнорируется, см. проблему)

Эта строка нужна вам для запуска вашего скрипта и запуска после него оболочки.

Exec=sh -c 'echo hello; $SHELL'
  1. sh -c 'COMMAND' запустите двоичный файл "sh" из $PATH, который выполняет КОМАНДУ (во многих системах sh символическая ссылка наbash, но для переносимости предпочтительнее "ш")
  2. echo hello; $SHELLделает две вещи. Во-первых, он работаетecho helloа затем, после выполнения этой команды, запускает $SHELL.

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


PS Если вы просто не хотите закрывать терминал, вы можете сделать

Exec=sh -c 'echo hello; read'

Или

Exec=sh -c 'echo hello; sleep 5'

(чтение будет ждать, пока вы нажмете Enter, сон просто подождет 5 секунд)

PPS $SHELL вероятно будет таким же, как последний раздел в /etc/passwd в соответствии с вашим пользователем.

$ man login

Значения для $HOME, $USER, $SHELL, $PATH, $LOGNAME и $MAIL устанавливаются в соответствии с соответствующими полями в записи пароля.

Просто добавь

;$SHELL 

в конце ваших команд.

Как для меня snapd не то, чтобы использовать полную пропускную способность системы для обновления снимков в любое время, когда я почти работаю ночью.

Так что это сработало для меня, чтобы создать .sh файл связан с .desktop файл.
Содержание для .sh файл был

echo <your password> | sudo -S systemctl stop snapd.service
sudo systemctl disable snapd.service;$SHELL

-S в первой строке .sh файл используется для отправки STDINPUT к sudo команда означает прямое выполнение без ввода пароля.

Содержание для .desktop файл был:

[Desktop Entry]
Version=1.0
Name=Test
Comment=Test the terminal running a command inside it
Exec=gnome-terminal -e "/scripts/disable_snap.sh"
Icon=terminal
Terminal=true
Type=Application
Categories=Application;
!#/bin/bash

gnome-terminal -e YOUR_COMMANDS

Сделайте файл выше. Не забудь sudo chmod +x filename.sh

Я сделаю это. Первая строка текстового файла:!#/ Bin/bash

Последующими строками текстового файла являются команды (сценарий оболочки).

Сохраните файл как что-то.sh

Откройте свойства файла и включите запуск файла в качестве программы.

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

Другие вопросы по тегам