执行 vi
和执行 vim.tiny
为什么是两种不同的模式?
这两个不是指向的是同一个文件 /usr/bin/vim.tiny
吗?
不同的表现在于:
以下是系统的一些信息:
root@debian:~# whereis vi
vi: /usr/bin/vi /usr/share/man/man1/vi.1.gz
root@debian:~# whereis vim.tiny
vim.tiny: /usr/bin/vim.tiny
root@debian:~# ls -la /usr/bin/ | grep vi
-rwxr-xr-x 1 root root 14560 Sep 16 2023 dbus-update-activation-environment
lrwxrwxrwx 1 root root 23 May 4 2023 rview -> /etc/alternatives/rview
-rwxr-xr-x 1 root root 18808 Jun 16 05:44 systemd-detect-virt
lrwxrwxrwx 1 root root 20 May 4 2023 vi -> /etc/alternatives/vi
lrwxrwxrwx 1 root root 22 May 4 2023 view -> /etc/alternatives/view
-rwxr-xr-x 1 root root 1629584 May 4 2023 vim.tiny
root@debian:~# ls -la /etc/alternatives/ | grep vi
lrwxrwxrwx 1 root root 17 May 4 2023 ex -> /usr/bin/vim.tiny
lrwxrwxrwx 1 root root 28 May 4 2023 ex.1.gz -> /usr/share/man/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.da.1.gz -> /usr/share/man/da/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.de.1.gz -> /usr/share/man/de/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.fr.1.gz -> /usr/share/man/fr/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.it.1.gz -> /usr/share/man/it/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.ja.1.gz -> /usr/share/man/ja/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.pl.1.gz -> /usr/share/man/pl/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.ru.1.gz -> /usr/share/man/ru/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 ex.tr.1.gz -> /usr/share/man/tr/man1/vim.1.gz
lrwxrwxrwx 1 root root 17 May 4 2023 rview -> /usr/bin/vim.tiny
lrwxrwxrwx 1 root root 17 May 4 2023 vi -> /usr/bin/vim.tiny
lrwxrwxrwx 1 root root 28 May 4 2023 vi.1.gz -> /usr/share/man/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.da.1.gz -> /usr/share/man/da/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.de.1.gz -> /usr/share/man/de/man1/vim.1.gz
lrwxrwxrwx 1 root root 17 May 4 2023 view -> /usr/bin/vim.tiny
lrwxrwxrwx 1 root root 28 May 4 2023 view.1.gz -> /usr/share/man/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.da.1.gz -> /usr/share/man/da/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.de.1.gz -> /usr/share/man/de/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.fr.1.gz -> /usr/share/man/fr/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.it.1.gz -> /usr/share/man/it/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.ja.1.gz -> /usr/share/man/ja/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.pl.1.gz -> /usr/share/man/pl/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.ru.1.gz -> /usr/share/man/ru/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 view.tr.1.gz -> /usr/share/man/tr/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.fr.1.gz -> /usr/share/man/fr/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.it.1.gz -> /usr/share/man/it/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.ja.1.gz -> /usr/share/man/ja/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.pl.1.gz -> /usr/share/man/pl/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.ru.1.gz -> /usr/share/man/ru/man1/vim.1.gz
lrwxrwxrwx 1 root root 31 May 4 2023 vi.tr.1.gz -> /usr/share/man/tr/man1/vim.1.gz
root@debian:~# ls -la /etc/vim
total 16
drwxr-xr-x 2 root root 4096 Aug 31 05:17 .
drwxr-xr-x 69 root root 4096 Aug 30 23:37 ..
-rw-r--r-- 1 root root 2553 May 4 2023 vimrc
-rw-r--r-- 1 root root 662 May 4 2023 vimrc.tiny
root@debian:~# cat /etc/vim/vimrc
" $VIMRUNTIME refers to the versioned system directory where Vim stores its
" system runtime files -- /usr/share/vim/vim<version>.
"
" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc.
" This happens after /etc/vim/vimrc(.local) are loaded, so it will override
" any settings in these files.
"
" If you don't want that to happen, uncomment the below line to prevent
" defaults.vim from being loaded.
" let g:skip_defaults_vim = 1
"
" If you would rather _use_ default.vim's settings, but have the system or
" user vimrc override its settings, then uncomment the line below.
" source $VIMRUNTIME/defaults.vim
" All Debian-specific settings are defined in $VIMRUNTIME/debian.vim and
" sourced by the call to :runtime you can find below. If you wish to change
" any of those settings, you should do it in this file or
" /etc/vim/vimrc.local, since debian.vim will be overwritten everytime an
" upgrade of the vim packages is performed. It is recommended to make changes
" after sourcing debian.vim so your settings take precedence.
runtime! debian.vim
" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes
" numerous options, so any other options should be set AFTER changing
" 'compatible'.
"set compatible
" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
"syntax on
" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
"set background=dark
" Uncomment the following to have Vim jump to the last position when
" reopening a file
"au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
" Uncomment the following to have Vim load indentation rules and plugins
" according to the detected filetype.
"filetype plugin indent on
" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
"set showcmd " Show (partial) command in status line.
"set showmatch " Show matching brackets.
"set ignorecase " Do case insensitive matching
"set smartcase " Do smart case matching
"set incsearch " Incremental search
"set autowrite " Automatically save before commands like :next and :make
"set hidden " Hide buffers when they are abandoned
"set mouse=a " Enable mouse usage (all modes)
" Source a global configuration file if available
if filereadable("/etc/vim/vimrc.local")
source /etc/vim/vimrc.local
endif
root@debian:~# cat /etc/vim//vimrc.tiny
" Vim configuration file, in effect when invoked as "vi". The aim of this
" configuration file is to provide a Vim environment as compatible with the
" original vi as possible. Note that ~/.vimrc configuration files as other
" configuration files in the runtimepath are still sourced.
" When Vim is invoked differently ("vim", "view", "evim", ...) this file is
" _not_ sourced; /etc/vim/vimrc and/or /etc/vim/gvimrc are.
" Debian system-wide default configuration Vim
set runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim90,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after
set compatible
" vim: set ft=vim:
1
ho121 121 天前 via Android
vi compatibility mode
|
2
ho121 121 天前 via Android
|
4
ho121 121 天前 via Android
@xlinux 估计是设计如此或者向前兼容吧,就像很多系统 bash 和 sh 是一个文件,执行 bash 进入的是 bash ,执行 sh 进入的是 POSIX shell
|
5
kkocdko 121 天前 2
echo "source /etc/vim/vimrc" > /etc/vim/vimrc.tiny
|
8
1423 121 天前 2
busybox
|
10
ho121 121 天前 via Android 1
@xlinux 单说“根据被调用的文件名,可以产生不同的行为。”,每个程序都能获得自己启动的路径、命令和参数。根据启动的命令不同,执行不同的逻辑,这个很容易实现。比较典型的比如 busybox 。
vim 的话,我试了试不是所有系统执行 vi 都自动进入兼容模式,可能不同系统编译 vim 的参不同,或者内置的配置不同。 |
11
winzkh 121 天前 1
@xlinux #9 获取到的第一个参数就是启动命令
```c #include <stdio.h> int main(int argc, char *argv[]) { printf("command: %s\n", argv[0]); return 0; } ``` |
12
vk42 121 天前 1
lz 可以去看下 busybox 的源码,一个可执行文件,通过建立不同名的符号链接来实现不同的功能比如 ls, ps 等
|
13
Kobayashi 120 天前 via Android 1
你搜搜 busybox 如何 link 的看看
|
14
guanzhangzhang 120 天前 1
busybox 就是一个二进制根据软链不同的名字执行不同的命令,这方面不单单是 c 语言,其他语言也可以做到的
|
15
LoliconInside 119 天前
Multi-Call Binary 了解一下
|