심볼릭 링크는 동일한 실행 가능 대상을 가리키지만 다른 작업을 수행합니다.

심볼릭 링크는 동일한 실행 가능 대상을 가리키지만 다른 작업을 수행합니다.

내 데비안 컴퓨터에 패키지가 있습니다 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을 실행하는 등의 작업을 수행합니다.

관련 정보