Вопрос vi / vim / view / etc / alternatives loop


Я хотел понять разницу между исполняемыми файлами vi а также vim, which привело меня к /usr/bin/, и там я нашел следующие символические ссылки:

/usr/bin/vi -> /etc/alternatives/vi
/usr/bin/vim -> /etc/alternatives/vim

Переход к /etc/alternatives/, Я видел, что эти имена ссылаются на /usr/bin/:

/etc/alternatives/vi -> /usr/bin/vim.gnome
/etc/alternatives/vim -> /usr/bin/vim.gnome

Поинтересовавшись, почему это так, я пришел к выводу, что оба указывают на один и тот же исполняемый файл, поэтому они совершенно одинаковы.

Однако в этот момент что-то пришло мне в голову; эта ссылка:

/etc/alternatives/view -> /usr/bin/vim.gnome

с этой ссылкой:

/usr/bin/view -> /etc/alternatives/view

Теперь это странно, так как я знаю, что когда я бегу view это не то же самое, что когда я запускаю vim; он открывает режим чтения только для файла, заданного в качестве аргумента. Есть ли vim.gnome бинарный знает, что связывает с ним при исполнении, как-то?

(кстати, та же проблема связана с vimdiff)

У вас есть объяснение?


2
2018-04-09 14:33


происхождения




ответы:


Это объясняется в man vim:

Vim ведет себя по-разному, в зависимости от имени команды (   исполняемый файл все равно может быть одним и тем же файлом).

ВИМ: 
    «Обычный» способ, все по умолчанию.

например: 
Начните в режиме Ex. Перейдите в обычный режим с помощью: "vi"   команда.                Также можно выполнить аргумент «-e».

Посмотреть: 
Начать в режиме только для чтения. Вы будете защищены от   письмо                файлы. Также можно сделать аргумент «-R».

gvim gview:
               Версия GUI. Запускает новое окно. Также можно сделать                аргумент «-g».

evim eview:
               Версия GUI в удобном режиме. Запускает новое окно. Может также                с аргументом «-y».

rvim rview rgvim rgview
               Как и выше, но с ограничениями. Это не будет возможным                для запуска команд оболочки или приостановки Vim. Так же может быть                сделано с аргументом «-Z».

Другими словами, vim будет определять имя, на которое оно было вызвано, и действовать соответствующим образом. Другой пример программы, которая ведет себя по-разному в зависимости от того, какое имя было запущено как bash который действует как минимальная оболочка POSIX, если вызывается как sh (см. INVOCATION in man bash).


2
2018-04-09 14:44



Отлично; но как vim знает название команды? - Bach
@Bach имя, которое вызывается программой, доступно этой программе. Детали зависят от используемого языка, но, например, в bash а также perl у тебя есть $0, В C, что и есть vim написано в, имя, которое был вызван исполняемый файл, хранится в argv[0] и тривиально настроить несколько тестов, которые заставляют программу вести себя по-разному в соответствии со значением argv[0], - terdon♦