在下列情况下,我们可以获得一个登录shell:
登录系统时获得的顶层壳,无论是通过本地终端登录,还是通过网络ssh登录。这种情况下获得的登录shell是一个交互式壳。
在终端下使用,登录选项调用bash,可以获得一个交互式登录shell。
在
脚本中使用,登录选项调用bash(例如:# !/bin/bash——登录)可以得到一个非交互式的登录shell。
使用su -切换到指定用户时,获得此用户的登录shell。如果不使用,则获得non-login壳。
登录shell启动时首先读?etc/profile系统全局配置,然后依次查找~/. bash_profile、~/. bash_login、~/. profile三个配置文件,并且读取首个找到的并且可读的文件。
登录shell退出时读取并执行~/. bash_logout中的 命令。如果配置文件存在但不可读,则会显示错误消息,如果文件不存在,bash将自动搜索下一个文件。
默认在/etc/profile文件中会定义路径,用户,邮件、主机名、HISTSIZE等全局环境变量,还会自动导入/etc/bash.bashrc文件(包含系统级壳函数和别名),以及/etc/profile.d路径下被用于针对特定程序进行初始化的所有* . sh。
非登录壳意味着在启动时不必通过系统身份验证。GUI中用户打开的终端默认为非登录壳,可以通过注销 命令判断:
#,在Ubuntu GUI桌面打开一个终端 在注销 bash:注销:not login shell:, use 退出# 39; 祝辞bash ——登录 祝辞,logout #,正常登出,什么也不会输出
非登录壳牌在初始化时仅读取~/ashrc资(源文件,而~/. bashrc文件会自动被~/. bash_profile或~/8乓募釉?因此为了保证登录shell和交互式non-login壳得到相同的配置,一般将环境变量定义在~/. bashrc文件中。
<>之前的祝辞,echo “export sflag=\“login shell will 阅读却;能够消息\““,在祝辞,~/.profile , 在bash 祝辞,echo sflag 美元; ,,,,,,,,,#,找不到这个变量,会打印一个空行 在退出 祝辞,bash ——login 祝辞,echo sflag 美元; login shell  will 阅读;却;能够message 祝辞,注销通过bash命令执行 脚本时会以非交互(经常)的方式启动壳,这保证了在脚本执行过程中不会被用户干扰。在非交互式脚本启动时,仅会加那么它将扩展BASH_ENV变载量指向的文件。但要注意,由于路径变量默认不会被非交互式壳加载,因此变那么它将扩展BASH_ENV的量,值应该为绝对路径。
通过特殊变量,可以查看当前壳的模式:
祝辞echo 美元- himBHs #,带有& # 39;我# 39;就是交互式壳
另一个简单的方式是检查当前壳中是否存在提示符环境变量PS1。
<>以前if [, -z “PS1"美元;,];,then echo “非交互式“;else echo “交互式“;fi <>强特殊情况强>如果使用命令sh调用bash,则为了保证兼容性会按照sh的方式对bash进行初始化。作为登录shell启动时,bash依次读取和~//etc/配置文件。剖面配置文件。作为non-login壳启动时,bash仅会读取环境变量ENV指向的文件。
当通过以下方式启动bash时:
<>前设置set -o  posix 或,export POSIXLY_CORRECT=1 bash ——posixbash会尽可能按照POSIX标准进行初始化,仅会读取环境变量ENV指向的文件。
使用rshd远程启动脚本时仅会加载~/ashrc文(件,但要注意的是尽量不要使用远程登录命令,telnet, rsh, rcp等远程命令,因为这些命令会传输未加密的明文信息。如果有远程访问需求尽量使用SSH。
在创建进程时会在task_struct中记录进程运行时所需要的信息。其中UID(真实用户ID)用于记录创建进程的用户的ID, EUID(有效用户ID)用于判断当前进程对文件的访问级别,一般情况下UID=EUID。如果可执行文件的set-user-ID: SUID位有效(例如:-rwsr-xr-x,用户的x被替换为s),表示当该文件被执行时,进程具有文件所有者的权限而不是执行者的权限(EUID的值为文件所有者的ID)。