"invoked as"는 Bash를 시작하는 프로세스가 "zeroth"명령 행 인수에 넣는 모든 것을 가리 킵니다 argv[0].
프로그램이 exec*()syscalls 로 시작되면 실제로 프로그램을 포함하는 이진 파일의 이름을 알지 못하지만 대신 호출 프로세스는 원하는 것을 자유롭게 넣을 수 있습니다. 일반적으로 이름은 파일 시스템에서 /bin/sh가져 오므로을 실행하면 그 이름 이 표시됩니다. 그리고 /bin/shBash 라면 심볼릭 링크 일 필요는 없으며 하드 링크이거나 쉘 프로그램의 다른 사본 일 수 있습니다.
"프로그램 이름"설정의 예로, Bash의 exec명령은 -a옵션으로 0 번째 인수를 설정할 수 있습니다 . (우리는 Perl이나 C 등으로 직접 똑같이 할 수 있습니다.)
다음 myname은 간단한 C 프로그램으로, 0 번째 인수 인 자체 이름을 출력합니다.
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
출처:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
그러나 번호가 매겨진 질문에 대답하려면 ...
(1 & 4) running 은에 있을지 모르지만 아마도 같은 것을sh somescript 실행 sh합니다 .PATH/bin/sh/usr/xpg4/bin/sh
- Bash 인 경우 이름이 보이기 때문에 POSIX 모드에서 실행됩니다
sh.
- Z 쉘 또는 Korn 쉘인 경우에도 마찬가지로 이름
sh이 표시되지만 "SH 호환"모드에서 실행됩니다.이 모드는 Bourne 쉘 호환을 목표로하며이 두 쉘에서 전체 POSIX 호환 모드와 미묘하게 다릅니다. .
- Almquist 쉘, 실제 Bourne 쉘 또는 다른 것 일 수 있습니다.
(2 & 5) 러닝 bash somescript은 일반 배쉬 모드에서 실행 됩니다 (물론 그것은 bash당신의 PATH것이 무엇인지 에 달려 있습니다 .)
(3) 여기서 스크립트 이름은 프로그램 파일 대신 시스템 호출에 직접 제공됩니다. 커널은 hashbang 행을 읽고이를 사용하여 스크립트를 실행합니다.
(6) 이것은 복잡한 것입니다. (3)과 비슷하지만 ENOEXEC (Exec format error)해시 뱅 라인이 없기 때문에 프로그램 시작을위한 시스템 호출이 실패합니다 ( ). 다음에 무슨 일이 당신이 실행하는 쉘인지 여부에서 따라 자신을 POSIX 모드. POSIX에서는 POSIX 호환 쉘이에 대한 응답으로 특정 방식으로 동작해야 ENOEXEC합니다. 그러나 "쉘을 호출하는 것과 동등한 명령"에는 약간의 차이가 있는데, 이는 다른 쉘이 다른 일을한다는 것을 의미합니다.
- Bourne Again 쉘 은 스크립트 이름을 첫 번째 명령 행 인수와 동일한 모드 로 다시 실행합니다 . POSIX 호환 모드에서는 물론 POSIX 호환 모드로 실행되므로 POSIX 호환 쉘을 호출하기위한 POSIX 요구 사항을 준수합니다.
- Z 쉘, Almquist 쉘 및 Korn 쉘
/bin/sh은 첫 번째 명령 행 인수로 다른 인수 앞에 삽입 된 스크립트 이름으로 실행 됩니다. Z 쉘, Almquist 쉘 및 Korn 쉘은 /bin/sh프로그램이 하나 라고 가정하여 POSIX 호환 쉘을 호출하려고 시도 합니다.