登录 shell 的 argv[0] 发生了什么变化?

登录 shell 的 argv[0] 发生了什么变化?

据我所知,至少最流行的 shell 使用 argv[0] 作为它们是否应该充当登录 shell 或非登录 shell 的指示器。如果 argv[0] 以“-”开头,则 shell(至少是 bash 和 zsh)将充当登录 shell。这个破折号附加到原始参数的哪里? shell 是否自行确定它是否应该是登录 shell,还是通过登录或 init 以某种方式完成?

考虑以下程序(将其命名为“测试”)。

int main (int argc, char *argv[]){
    printf("first argument: %s\n", argv[0]);
    return 0;
}

如果这个程序是从 shell 调用的,它会显示“第一个参数:测试”。如果从 shell 调用某个 shell 程序(例如 zsh),则 $0 变量是“zsh”。但是,如果 passwd(5) 中的用户默认登录 shell 定义为 zsh,则首次登录后 $0 变量为“-zsh”。如果我将用户默认 shell 更改为 test,则上述程序在登录后仍会打印“test”,而不是“-test”。

那么,argv[0] 是由某些 exec() 调用(从哪里)设置的,还是 shell 自己设置的(基于什么条件?)。

这个问题不同于为什么我们在登录 shell 上用 logi 调用时看不到来自 0 的单个连字符。它询问破折号字符的作用以及如何手动更改它。在正常使用情况下,它不会询问将其附加到 argv[0] 的位置。然而,其他主题中最流行的答案声称登录负责 argv[0] 的更改。目前仍缺乏有关该机制的信息。为什么将 zsh 更改为 -zsh 但不将 test 更改为 -test。

相关内容