Это зависит. Графические программы обычно используют те же методы, что и неграфические; то есть один из:
Иногда программа передает список параметров непосредственно ядру, используя что-то вроде:
if (fork() == 0)
execlp("vim", "--remote-tab-silent", "/home/LeNoob/somefile.txt", NULL);
Различные функции exec*()
сообщают ядру:«Запустите именно это и передайте точный список параметров командной строки в argv[]
».
В других случаях программы попросят оболочку - /bin/sh
- интерпретировать командную строку:
system("vim $HOME/.bashrc");
Это практически та же оболочка, что и в терминалах, но она запускается в неинтерактивном режиме с использованием опции -c
. Кроме того, это всегда /bin/sh
по соглашению, независимо от того, какую оболочку (bash, zsh ...) вы выбрали для интерактивного использования. Таким образом, вышеупомянутое грубо так же, как:
if (fork() == 0)
execl("/bin/sh", "-c", "vim $HOME/.bashrc");
(Сама оболочка, конечно, будет использовать exec*()
напрямую.)
Наконец, среды рабочего стола, использующие D-Bus, могут использовать его для запуска различных служб, просто отправив сообщение на желаемое "имя шины" (например, org.gnome.gedit
). Также известный как "активация шины", когда dbus-daemon видит программу, отправляющую сообщение на имя шины, которой на данный момент ничего не "принадлежит", он ищет в своей конфигурации путь к программе и снова использует exec () для ее запуска.
Это часто используемая функция D-Bus, но в основном только для фоновых сервисов, таких как "dconf". В будущем GNOME планирует использовать это для запуска обычных приложений, таких как Nautilus или Gedit. Однако прямо сейчас он использует тот же метод, что и все другие DE, читая соответствующий файл .desktop
[см. Ниже] и exec () непосредственно в программе, так что я включил это только для полноты.
(Конечно, в реальных программах нет жестко запрограммированных "vim"
и "somefile.txt"
- они используют что-то вроде getenv("EDITOR")
и нужного имени файла - но вы понимаете, в чем дело).
Тем не менее, все это на самом деле не имеет значения, так как оболочка никогда не интерпретирует псевдонимы в не интерактивном режиме, и в то время как он будет интерпретировать функции оболочки, он никогда не будет читать ваш ~/.bashrc
, чтобы увидеть , какие функции вы определили.
Итак, следующие вопросы: как настроить gVim в качестве текстового редактора? и ваша программа ищет gvim
в каталогах $ PATH, или она берет полный путь /usr/bin/gvim
из своего файла конфигурации?
В терминальных программах используется переменная $EDITOR
, поэтому вместо EDITOR=gvim
вы можете использовать EDITOR="gvim --remote-tab-silent"
в вашем ~/.profile или аналогичном.
Среды рабочего стола находят gVim в соответствии с /usr/share/applications/gvim.desktop
- в частности, строкой Exec=gvim -f %F
, которая только говорит им запустить gvim
но не говорит, где она находится, поэтому $ PATH будет используемый. Это означает, что его можно переопределить двумя способами:
Вы можете создать скрипт, который обернет gvim
и поместить его где-нибудь в начале $ PATH - например, вызвать скрипт ~/bin/gvim
затем поместить ~/bin
в начале $ PATH;
или вы можете скопировать файл .desktop из /usr в ~/.local/share/applications/gvim.desktop
и изменить строку Exec=
чтобы иметь нужные параметры:
Exec=gvim --remote-tab-silent -f %F
(Обычно изменения будут получены немедленно, но если этого не произойдет , попробуйте запустить kbuildsycoca4
или kbuildsycoca4 --noincremental
из терминала.)