Symlink

符號連結指向同一個可執行目標,但做不同的事情

  • February 16, 2021

我在我的 Debian 機器上有vim-athena包(對於 觀察到的相同)。vim-gtk

  • 執行vim會在終端中生成 Vim。
  • 執行gvim會在 Athena GUI 中使用 Vim 生成一個新視窗。

但什麼是vimgvim?指向同一目標的符號連結。

$ 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.tinyand vim.athena,但即使我選擇後者,Vim 總是在終端中打開,而不是在單獨的 GUI 中。

該程序可以通過查看第零個參數argv[0](在本例中為vimgvim)來採取不同的路線。

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(&params);
   ...

/* 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,等等。

引用自:https://unix.stackexchange.com/questions/634083