인수가 vi 자체로 vi에 전달되는 이유는 무엇입니까? [폐쇄]

인수가 vi 자체로 vi에 전달되는 이유는 무엇입니까? [폐쇄]

다음과 같이 첫 번째 인수를 vi 자체로 vi에 전달하는 이유는 무엇입니까?

/bin/vi vi

그냥 쓰면 안되는 이유:

/bin/vi

두 명령 사이에서 내가 본 유일한 차이점은 인수 vi없이 실행이 vi켜져 있는 vim반면, vi인수로 제공하면 그렇지 않다는 것입니다.

여기서 무슨 일이 일어나고 있는 걸까요?

답변1

execl실행할 명령의 경로와 매개변수를 가져옵니다.

관례적으로 첫 번째 인수는 실행 중인 파일과 관련된 파일 이름을 가리켜야 합니다.

그렇기 때문에 첫 번째 매개변수는 입니다 "vi".

한편으로는 명령에 대한 경로를 지정하고 argv다른 한편으로는 프로그램이 수신하는 배열을 지정하는 것으로 생각할 수 있습니다(여기서는 조금 단순화했습니다). argv[0]호출 수신자에게 포함될 내용을 지정하는 것은 호출자에게 달려 있습니다 .

프로그램을 사용하여 argv[0]동작을 조정할 수 있습니다. 보시다시피 Vim을 Vi라고 하면 Vi처럼 동작합니다 vi. 또 다른 예는 busybox단일 바이너리에 여러 명령을 구현하는 것입니다.

답변2

표준 또는 표준 호환 셸의 명령줄에 다음 명령을 작성하는 경우:

/bin/vi vi

그런 다음 쉘은 /bin/vi매개변수를 사용하여 실행됩니다 vi. 당신이 달리면

/bin/vi

대신 쉘이 실행됩니다 /bin/vi.

사실 이것은 단순화된 것입니다. 시스템 호출 수준에서 첫 번째 호출은 /bin/vi인수 /bin/vi로 실행 vi되고 두 번째 호출은 인수로 실행됩니다 /bin/vi. 일반적으로 명령 이름만 포함하는 "zero" 매개변수는 무시됩니다.

이제는 그렇지 않습니다 /bin/vi. 오히려 /usr/bin/viVIM의 일부 버전입니다. 달리기

/usr/bin/vi vi

vi현재 디렉터리에서 호출된 파일을 열도록 지시합니다. 달리기

/usr/bin/vi

시작하라고만 하고 파일 이름이 제공되지 않으므로 이름 없는 버퍼를 엽니다. 이 경우 적어도 이 특정 VIM은 다음과 같은 인사말도 인쇄합니다.

~                               VIM - Vi IMproved
~
~                                 version 8.0.707
~                           by Bram Moolenaar et al.
~            Modified by [email protected]
~                  Vim is open source and freely distributable

:q( 및 같은 유용한 명령이 계속됩니다 :help.)

물론 일부 다른 버전에서는 vi이러한 배너가 인쇄되지 않습니다.

관련 정보