Эти приложения на основе графического интерфейса также выполняют ту же команду в фоновом режиме?
Да и нет. Они пишут в dconf
базу данных настроек, но могут использовать разные способы для этого. Программы, написанные на Python, вероятно, будут использовать gi.repository.Gio
модуль (я знаю, потому что я часто его использую), или вместо этого они могут использовать его gsettings
как внешнюю команду, вызывая ее subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, и он будет в основном работать как команда оболочки. Программа AC будет использовать нечто подобное, скорее всего, gio.h
библиотеку, или она может даже использовать exec()
семейство функций для того же, что Popen
и в python. Итак, чтобы ответить на ваш заглавный вопрос: "Приложение на основе графического интерфейса выполняет команды оболочки в фоновом режиме?" Они могут, но, вероятно, в этом нет необходимости, потому что есть библиотека для любого языка, на котором написано приложение, и, вероятно, будет немного быстрее использовать библиотечную функцию, чем порождать новый процесс.
Чтобы дать вам пример того, как это делается с библиотеками / модулями, не стесняйтесь взглянуть на исходный код индикатора моего списка запуска. Там я написал функцию для создания экземпляра Gio.Settings
класса, а затем использую его для изменения модуля запуска Unity в зависимости от типа списка, который вы хотите иметь там.
Как заглянуть во внутреннюю работу этих приложений? Я имею в виду, есть ли способ на самом деле смотреть на команды, которые выполняются при каждом нажатии кнопки?
Нет. Если вы хотите увидеть, какая команда выполняется на языке программирования этого приложения, когда вы нажимаете кнопку или нажимаете на элементы окна, это невозможно. Прочитайте исходный код приложения, если есть возможность его получить. Вы можете использовать, dconf watch /
чтобы увидеть, какие настройки меняются, а не как это делается.
Технически, если вы знаете, как работать с отладчиком, читать адреса памяти и знать некоторый язык ассемблера, то вы можете знать, что приложение делает на уровне процессора и памяти. Это называется реверс-инжинирингом программного обеспечения и часто используется специалистами по безопасности для анализа вредоносного программного обеспечения и обнаружения уязвимостей в легальном программном обеспечении.
Эти приложения открывают терминал в фоновом режиме и выполняют эти команды?
Нет, нет подключенного терминала. Многие программы знают, где находится dconf
база данных для пользователя и пишут туда. Существует также межпроцессная коммуникационная шина, известная как dbus
, где программы могут отправлять сигналы, и программа будет выглядеть как «Эй, это сообщение для меня!»
добавление
Могут ли приложения запускать другие приложения? Да, это делается с помощью стандартных fork()
и execve()
системных вызовов. Суть создания процессов в Linux и других * nix системах в значительной степени основана на этих двух. Механизм оболочки для запуска не встроенных команд использует это особенно. Когда вы работаете в интерактивном режиме
$ ls
оболочка создаст новый процесс через fork()
, этот процесс будет запущен, execve()
который запустится ls
. Из-за того execve()
, каким будет этот новый раздвоенный процесс ls
. pipe()
Системный вызов , что поможет считан выходу ls
. Я настоятельно рекомендую прочитать мой ответ «В чем разница между конвейером и перенаправлением, чтобы понять, как работает конвейерный механизм - это не просто |
оператор, а фактически системный вызов».
Могут ли приложения запускать команды оболочки? Нет. Синтаксис оболочки понимается только самой оболочкой. Однако вы можете запустить оболочку с параметром командной строки -c
и предоставить соответствующие команды. Это часто используется для пользовательских ярлыков, установленных в GNOME или других средах рабочего стола, поскольку настраиваемые ярлыки работают на исполняемых файлах, и нет оболочки для понимания синтаксиса. Таким образом, в качестве примера, вы могли бы сделать bash -c 'xdotool key Ctrl+Alt+T'
косвенный запуск xdotool
команды или bash -c 'cd $HOME/Desktop; touch New_File'
создать новый файл на рабочем столе с помощью ярлыка. Это особенно интересный пример, поскольку вы можете использовать переменную оболочки, поскольку вы используете оболочку явно.
Следите за происходящим
Большинство из этих редакторов настроек можно посмотреть, запустив
в терминале.
gsettings
Кроме того, в большинстве случаев для достижения того, что вы видите с помощью приведенной выше команды, эти приложения должны будут редактировать
dconf
базу данных (подробнее ниже). Это можно сделать либо напрямую , используя параметры cli dconf (что не является предпочтительным), либо запустив соответствующиеgsettings
команды, такие как упомянутая вами.Для запуска этих команд окно терминала не требуется, как вы можете видеть в примерах.
О, gsettings, dconf и база данных dconf
gsettings
это клиентский интерфейсdconf
, который в свою очередь редактируетdconf
базу данных, в которой хранится большинство настроек, в двоичном формате. Смотрите также этот хороший ответ .dconf
Базы данных, кстати, также могут быть изменены с помощью графического интерфейса с помощьюdconf
редактора, который находится в хранилищах:Рабочие образцы
а. В питоне
Чтобы показать вам, что происходит под капотом, под рабочим образцом для переключения позиции запуска из графического интерфейса пользователя с помощью одной (кнопки) переключения:
file.py
запустите его командой:
...и получать удовольствие.
б. Значок запуска
Даже простой лаунчер может сделать работу из графического интерфейса:
setlauncher.desktop
Для постоянного использования сохраните его
~/.local/share/applications
(для локального использования) или~/usr/share/applications
для всех пользователей.источник