在
#include <unistd.h>
int execve(const char * pathname , char *const argv [], char *const envp []);
argv [0]
ofexecve
对应argv[0]
于新程序的 main 函数,因此通常与pathname
参数的 basename 组件相同。这是我们应该始终遵循的要求吗?
当程序文件可以由不同的值调用时argv[0]
,该规则/约定是否意味着当我调用程序文件并希望argv[0]
它main()
具有特定值时,我必须创建指向以值命名的程序文件的符号链接argv[0]
,并通过符号链接调用程序?或者不一定?例如,这个回答“为什么 argv 包含程序名称?” 说
argv[0]
当is时,Bash 在 POSIX 模式下运行sh
。argv[0]
它以 .开头时作为登录 shell 运行-
。
这是否意味着
要在 POSIX 模式下调用 bash,我必须创建一个符号链接并通过指向字符串
/path/to/sh
来/bin/bash
调用 bash ?这种方式比指向字符串的位置更可取吗?execve("/path/to/sh", argv, ...)
argv[0]
"sh"
execve("/bin/bash", argv, ...)
argv[1]
"--posix"
argv[0]
要将 bash 作为登录 shell 调用,我必须创建一个符号链接并通过指向字符串
/path/to/-
来/bin/bash
调用 bash ?这种方式比指向字符串的位置更可取吗?execve("/path/to/-", argv, ...)
argv[0]
"-"
execve("/bin/bash", argv, ...)
argv[1]
"--login"
argv[0]
argv [0]
of与参数的基本名称组件execve
不同时有用吗?pathname
您链接到的问题的公认答案说
这解决了你的主要问题。
您关于启动程序的各种问题似乎源于误解。您不需要使用链接(符号链接或硬链接)来启动
argv[0]
设置为名称以外的值的程序;你需要能够控制给定的数组execve
。这就是login
它启动 shell 时所做的:它在它前面加上-
inargv[0]
。Bash 在它
argv[0]
是时以 POSIX 模式启动sh
,因此它可以用作/bin/sh
. 如果需要使用--posix
,则需要更改很多 shell 脚本。相同的推理适用于
-
登录 shell:此约定适用于任何 shell,无论它是否支持--login
选项。argv[0]
登录用例是一个示例,说明何时不等于程序名称很有用。