// 这本书终于看完了,但是学的还是比较基础,解决问题的能力还有待提高。:) // 在 POSIX 下定义的的 shell 语言,比原始的 V7 Bourne Shell 规模大很多,但又比 ksh93 和 bash 所实例的语言小,这两种语言是 Bourne shell 扩展版本里,最广泛使用的。 // // shell 初始化与终止 // 为了支持用户客户话,shell 会在启动、终止时,读取某些特定文件。每个shell 都有不同的惯例模式。 // shell 的行为模式端视它是否为登录 shell(login shell) 而定。一下两种情况是 login shell 1, 在终端中输入 username 和 password 时 2, ssh hostname 时 // 以下不是 login shell 1, 指定名称执行 shell 或直接在脚本首行 #! 下指定的命令解析器执行 2, 建立一个新的工作站终端况口 3, ssh hostname command 时 // shell 检查 $0 的值决它是否为登录shell,如果该值以连字号起始,即为登录shell,否则不是 // echo $0 查看 // // // Bourne Shell -- sh // Korn Shell -- ksh // Bourne-Again Shell -- bash // Z-Shell // /** * Bourne Shell -- sh 启动 */ 当它为登录shell 时,Bourne Shell -- sh 相当于: test -r /etc/profile && . /etc/profile test -r $HOME/.profile && . $HOME/.profile // 在 sh 离开时,Bourne shell 不会读取标准的终结文件,可以设置一个捕捉 trap '. $HOME/.logout' EXIT // // /** * Korn Shell */ ksh 启动为 登录shell 时,它会像 Bourne Shell 一样读取 /etc/profile 和 $HOME/.profile 当 ksh93 启动为交互式shell(登录或非登录),它会这样操作: test -r "$ENV" && eval . "$ENV" /** * Bourne-Again shell 启动与终结 */ 当 bash 为登录 shell 时,启动时它的操作相当于: ----------------------------------------------- test -r /etc/profile && . /etc/profile if test -r $HOME/.bash_profile ; then . $HOME/.bash_profile elif test -r $HOME/.bash_login; then . $HOME/.bash_login elif test -r $HOME/.profile; then . $HOME/.profile fi ----------------------------------------------- 离开时,一个 bash登录shell 会做 test -r $HOME/.bash_logout $$ . $HOME/.bash_logout // // // bash 在交互式非登录shell 下启动时会读取初始文件 test -r $HOME/.bashrc && . $HOME/.bashrc 此情况下就不会读取登录shell 的启动文件 // // // 当 bash 使用非交互模式时,不会读取 .bashrc 文件或登录shell启动文件,它改为读取定义于 BASH_ENV 变量中的文件,像 test -r "$BASH_ENV" && eval . "$BASH_ENV"