다음과 같이 첫 번째 인수를 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/vi
VIM의 일부 버전입니다. 달리기
/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
이러한 배너가 인쇄되지 않습니다.