Symlink
符號連結指向同一個可執行目標,但做不同的事情
我在我的 Debian 機器上有
vim-athena
包(對於 觀察到的相同)。vim-gtk
- 執行
vim
會在終端中生成 Vim。- 執行
gvim
會在 Athena GUI 中使用 Vim 生成一個新視窗。但什麼是
vim
和gvim
?指向同一目標的符號連結。$ readlink -e "$(type -p gvim)" /usr/bin/vim.athena $ readlink -e "$(type -p vim)" /usr/bin/vim.athena
最終目標是二進製文件。
$ file --brief /usr/bin/vim.athena ELF 64-bit LSB shared object, ...
如果兩者都解析為相同的二進製文件,怎麼會是這樣
vim
並做不同的事情呢?gvim
背景:
我正在通過
update-alternatives --config editor
. 在列表中,有vim.tiny
andvim.athena
,但即使我選擇後者,Vim 總是在終端中打開,而不是在單獨的 GUI 中。
該程序可以通過查看第零個參數
argv[0]
(在本例中為vim
或gvim
)來採取不同的路線。Vim 這樣做
main.c
:params.argv = argv; ... /* Figure out the way to work from the command name argv[0]. "vimdiff" starts diff mode, "rvim" sets "restricted", etc. */ parse_command_name(¶ms); ... /* Check for: [r][e][g][vi|vim|view][diff][ex[im]] (sort of) */ static void parse_command_name(mparm_T *parmp) { char_u *initstr; initstr = gettail((char_u *)parmp->argv[0]); ... /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ if (TOLOWER_ASC(initstr[0]) == 'g') { main_start_gui();
在這個片段中,程序檢查 basename 的第一個字元是否
argv[0]
為“g”;如果是,它會啟動 GUI。這可以通過創建連結來觀察:
ln -s /usr/bin/vim.athena vimX ln -s /usr/bin/vim.athena gvimX ln -s /usr/bin/vim.athena evimX ln -s /usr/bin/vim.athena rvimX ln -s /usr/bin/vim.athena exX
在哪裡
X
是什麼,然後./vimX
在終端中執行 Vim,./gvimX
在 GUI 中,./evimX
在簡單模式下執行 Vim,等等。