존재하다
#include <unistd.h>
int execve(const char * pathname , char *const argv [], char *const envp []);
argv [0]
of는 새 프로그램의 주요 기능 execve
에 해당하므로 일반적으로 인수의 기본 이름 부분과 동일합니다. 이것이 우리가 항상 따라야 하는 요구 사항입니까?argv[0]
pathname
프로그램 파일이 다른 값으로 호출될 수 있는 경우 argv[0]
, 이 규칙/관례는 프로그램 파일을 호출하고 특정 값을 갖기를 원할 때 argv[0]
해당 값 main()
으로 명명된 프로그램 파일에 대한 심볼릭 링크를 생성하고 argv[0]
심볼릭 링크 호출 프로그램? 아니면 반드시 그렇지는 않습니까? 예를 들어,"argv에 프로그램 이름이 포함된 이유는 무엇입니까?"에 대한 답변입니다.설명하다
argv[0]
그렇다면 Bash는 POSIX 모드에서 실행됩니다sh
. 로 시작 하면argv[0]
로그인 쉘로 실행됩니다-
.
이게 무슨 뜻이야?
POSIX 모드에서 bash를 호출하려면 심볼릭 링크를 생성
/path/to/sh
하고 string을 가리켜/bin/bash
bash 를 호출해야 합니다 . 이것이 문자열을 가리키는 것 보다 낫고 문제가 되지 않습니까 ?execve("/path/to/sh", argv, ...)
argv[0]
"sh"
execve("/bin/bash", argv, ...)
argv[1]
"--posix"
argv[0]
bash를 로그인 셸로 호출하려면 기호 링크를 만들고
/path/to/-
문자열 ? 를 가리켜/bin/bash
bash 를 호출해야 합니다 . 이 방법이 문자열의 위치를 가리키는 것보다 바람직하며 중요하지 않습니까?execve("/path/to/-", argv, ...)
argv[0]
"-"
execve("/bin/bash", argv, ...)
argv[1]
"--login"
argv[0]
argv [0]
언제 유용합니까 execve
?아니 똑같다pathname
매개변수의 기본 이름의 일부로 ?
답변1
귀하가 링크한 질문에 대한 답변은 다음과 같습니다.
먼저, 반드시
argv[0]
프로그램 이름일 필요는 없다는 점에 유의하세요.
이것은 주요 문제를 해결합니다.
출시 계획에 대한 다양한 질문은 오해에서 비롯된 것 같습니다. 이름 이외의 값으로 설정된 프로그램을 실행하기 위해 링크(기호 링크 또는 하드 링크)를 사용할 필요는 없습니다. argv[0]
주어진 배열을 제어할 수 있어야 합니다 execve
. login
쉘이 시작될 때 수행하는 작업은 다음 과 같습니다 . -
in 접두사가 붙습니다.argv[0]
argv[0]
Bash 는 시작 시 POSIX 모드로 시작 sh
되므로 /bin/sh
.--posix
동일한 추론이 -
로그인 쉘에도 적용됩니다. 이 규칙은 --login
옵션 지원 여부에 관계없이 모든 쉘에 적용됩니다.
로그인 사용 사례는 argv[0]
프로그램 이름과 동일하지 않은 유용한 예입니다.