Это зависит. Графические программы обычно используют те же методы, что и неграфические; то есть один из:
Иногда программа передает список параметров непосредственно ядру, используя что-то вроде:
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 из терминала.)