シンボリックリンクは同じ実行可能ターゲットを指しますが、別のタスクを実行します。

シンボリックリンクは同じ実行可能ターゲットを指しますが、別のタスクを実行します。

私のDebianコンピュータにパッケージがありますvim-athena(同じ観察)。vim-gtk

  • 実行すると、vim端末に Vim が生成されます。
  • 実行すると、gvimAthena 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、がありますvim.athenaが、後者を選択しても、Vimは常に別のGUIではなく端末で開きます。

ベストアンサー1

プログラムは0番目の引数(または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();

このコードスニペットでは、プログラムはデフォルト名の最初の文字が 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端末、GUIで./gvimX Vimを実行し、./evimXシンプルモードでVimを実行するなどのタスクを実行します。

おすすめ記事