码迷,mamicode.com
首页 > 其他好文 > 详细

Bash的类型(交互、登录)及其相关配置文件

时间:2015-06-20 22:15:01      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:shell bash 类型

最近在学习Bash方面的相关知识,了解了Bash的基本分类和其相关的配置文件。在参考网上一些资料的时候,发现网上的一些资料写得很乱而且也不够全面,同时对shell分类的定义也不够本质,甚至某些说法还有一些误导读者的倾向。索性自己根据Bash手册页中的相关内容总结一下。

Bash用法概览:

    bash [option] file

Bash部分选项说明(只取和本篇相关的来说明):

    -c string 如果使用-c选项,将从string处读取命令。如果string后面有参数(具体指令的参数arguments)的话,他们将被分配给由$0开始的位置参数(Bash的参数parameters)。

    -i 如果使用-i选项,该shell就是交互的。

    -l 使Bash被调用后的行为犹如登录shell(实际上不是真的存在哪个用户来登录,原文此处使用了完成时态的虚拟语气,编者注)。

    --rcfile file 如果shell是交互的,则从file中执行命令而不是从标准的个人初始化文件~/.bashrc中执行。

    --login 等同于-l

    --noprofile 不会读取系统全局启动文件/etc/profile,也不会读取以下任何一个个人初始化文件~/.bash_profile,~/.bash_login或者~/.profile。默认情况下,当作为登录shell调用时Bash会读取这些文件。

    --posix 将Bash默认不同于POSIX标准的行为进行修改,以匹配POSIX标准(posix模式)。

Bash的调用:

登录shell就是参数零的第一个字符是"-"号,或者以--login选项启动的shell。(注意在登录shell中显示该shell的特殊变量0,如echo $0,会看到这个变量的记录的字符以-开头,编者注释)

交互shell就是没有以非选项参数及-c选项、标准输入和错误都被连接终端(由isatty(3)决定),或者以-i选项来启动的shell。如果shell是交互的,PS1会被设定同时变量$-包含字符i,一次来实现使用脚本或者启动文件来测试这种状态。

接下来的段落描述了Bash是如何来执行它的启动文件的。如果以下文件中的任何一个存在但是不可以读取,Bash会报告一个错误。文件名中的波浪号用来进行扩展,具体参见扩展章节的波浪号扩展。(众所周知,"~"扩展以后其实就表示用户的家目录啦,编者注)

当Bash被当作交互式登录shell或者被当作带有--login选项的非交互式shell调用时,Bash首先读取并从文件/etc/profile中执行命令,如果该文件存在的话。读取该文件之后,Bash按照如下先后顺序搜索文件~/.bash_profile,~/.bash_login,~/.profile,然后读取第一个存在而且可读的文件并且执行其中的命令。可以在shell启动时使用--noprofile选项来禁止这种行为。

如果是以登录shell注销的,Bash会读取并执行文件~/.bash_logout和/etc/bash.bash_logout中的命令,假如文件存在的话。

当要启动非登录交互式shell时,Bash读取并从~/.bashrc中执行命令,如果该文件存在的话。可以使用选项--norc来禁止这中情况。选项--rcfile file会强制Bash从file处读取并执行命令,而不是从~/.bashrc中。

当Bash以非交互方式启动时,比如运行了一个shell脚本,Bash会在环境中查找变量BASH_ENV,如果BASH_ENV存在的话,Bash就会扩展其值,并且使用该变量的值作为要读取和执行的文件名。Bash的行为犹如下面的命令执行后的结果:

                if    [ -n "$BASH_ENV" ];    then    . "$BASH_ENV";    fi

不过PATH变量中的值不会用来搜索该文件名。(如果要使用变量BASH_ENV来指定Bash的启动文件的话,注意要使用文件的全路径的额,编者注)

如果使用名称sh来调用的话,Bash会尽可能接近地尝试模拟sh历史版本的启动行为,同时也更贴合POSIX标准。当被当作交互式登录shell或者被当作带有--login选项的非交互式shell调用时,Bash首先试图读取并按照顺序从/etc/profile和~/.profile中执行命令。可以使用选项--noprofile禁止这种行为。当作为带有名称sh的交互shell调用时,Bash查找变量ENV,如果ENV已被定义就扩展其值,同时使用该扩展值作为读取和执行文件的名称。既然使用sh方式调用的shell不会读取任何其它启动文件并从中执行命令,那么,--rcfile就不会产生影响。使用sh名称调用的非交互shell也不会读取任何其它文件。当使用sh方式调用时,Bash会在读取启动文件之后进入posix模式。

当Bash进入posix模式时,比如使用了--posix命令行选项,bash对启动文件的处理遵循POSIX标准。在这个模式下,交互式shell扩展ENV变量,同时命令会从以变量扩展值作为名称的文件中读取并被执行。Bash不会再读取其它的启动文件。

当运行时,Bash尝试决定由远程shell守护,通常为rshd,或者安全shell守护进程sshd,链接到网络连接上的标准输入。如果Bash决定以这种方式运行,它会从~/.bashrc中读取并执行命令,假如该文件存在而且可读的话。如果以sh的方式调用的话,Bash就不会如此处理。选项--norc


本文出自 “隔山打牛敲山震虎” 博客,请务必保留此出处http://geshandaniu.blog.51cto.com/6567097/1663840

Bash的类型(交互、登录)及其相关配置文件

标签:shell bash 类型

原文地址:http://geshandaniu.blog.51cto.com/6567097/1663840

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!