通常,用户进程是该用户在 /etc/passwd 中指定的 shell 的子进程。Shell 的初始化文件经常会修改路径(path)。
在登录时,shell 的名称前面会加上 '-',例如 bash 会被调用为 '-bash'。这向 shell 发出信号,表明它是一个“登录” shell。在这种情况下,shell 会执行“登录”初始化文件。否则,将执行一些较轻量的初始化。此外,shell 还会检查它是否是交互式的 - 命令是来自文件还是交互式 tty。这会修改 shell 初始化,以便非交互式非登录 shell 的初始化非常轻量——在这种情况下,bash 不会执行任何初始化文件!
作为普通的登录 shell,bash 会“source”系统范围的文件 /etc/profile,其中可以为 bash 用户设置系统环境和路径。但是,当系统将 shell 解释为非交互式时,它不会运行。最重要的情况是在 rsh 中,远程命令在邻近机器上执行。/etc/profile 不会运行,路径从 rsh 守护进程继承。
bash 接收命令行参数 -login 和 -i,这些参数可以分别用于将 shell 设置为登录 shell 或交互式 shell。
用户可以通过创建文件 ~/.bash_profile、~/.bash_login 或 ~/.profile 来覆盖在 /etc/profile 中设置的值。请注意,只会执行其中第一个存在的文件,这与 csh 初始化的逻辑不同。~/.bash_login 不会专门为登录 shell 执行,如果 .bash_profile 存在,则根本不会执行它!
如果 bash 使用名称 sh 而不是名称 bash,它会模拟原始 Bourne shell 的初始化:它仅 source 文件 /etc/profile 和 ~/.profile,并且仅针对登录 shell。
作为登录 shell,tcsh 按以下顺序执行文件
tcsh 可以被编译为在 cshrc 脚本之前执行登录脚本。请注意!
非交互式 shell 仅执行 *cshrc 脚本。*login 脚本可以在登录时只设置一次路径。