好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

4页
  • 卖家[上传人]:gg****m
  • 文档编号:213367129
  • 上传时间:2021-11-21
  • 文档格式:DOCX
  • 文档大小:60.15KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Bash的类型(交互、登录)及其相关配置文件最近在学习Bash方面的相关知识,了解了 Bash的基本分类和其相关的配置文件在参考网上一些资料的 时候,发现网上的一些资料写得很乱而且也不够全而,同时对shell分类的定义也不够本质,甚至某些说法 还有一些误导读者的倾向索性自己根据Bash手册页中的相关内容总结一下Bash用法概览:bash [option] fileBash部分选项说明(只取和本篇相关的來说明):-c string如:果使用・c选项,将从string处读取命令如果string厉而有参数(具体指令的参arguments) 的话,他们将被分配给由$0开始的位置参数(Bash的参数parameters)o-i如果使用・i选项,该shell就是交互的・1使Bash被调用后的行为犹如登录shell(实际上不是真的存在哪个用户來登录,原文此处使用了完成时 态的虚拟语气,编者注)rcfile file如果shell是交互的,则从file中执行命令而不是从标准的个人初始化文件~/.bashrc中执行login等同于・1-noprofile不会读取系统全局启动文件/etc/profile,也不会读取以下任何一个个人初始化文件 ~/.bash_profile, -/.bash」ogin或者-/.profile。

      默认情况下,肖作为登录shell调用时Bash会读取这些文 件posix将Bash默认不同于POSIX标准的行为进行修改,以匹配POSIX标准(posix模式)Bash的调用:登录shell就是参数零的第一个字符是”■“号,或者以-login选项启动的shell注意在登录shell中显示该 shell的特殊变量0,如echo $0,会看到这个变量的记录的字符以■开头,编者注释)交互式shell就是没冇以TF•选项参数及・c选项、标准输入和错谋都被连接终端(由isatty⑶决定),或者以・i 选项來卅动的shelL如果shell是交互的,PS1会被设疋同时变量$■包含字符i, 一次来实现使用脚本或者 启动文件来测试这种状态接下來的段落描述了 Bash是如何来执行它的启动文件的如果以下文件中的任何一个存在但是不可以读 取,Bash会报告一个错误文件名中的波浪号用來进行扩展,具体参见扩展章节的波浪号扩展众所周 知,”~”扩展以后其实就衣示用户的家目录啦,编者注)交互式登录shell,或者带W-login选项的调用当Bash被当作交互式登录shell或者被当作带有-login选项的非交互式shell调用时,Bash首先读取并 从文ft/etc/profile中执行命令,如果该文件存在的话。

      读収该文件之后,Bash按照如下先后顺序搜索文件 ~/.bash_profile, ~/.bash」ogin, -/.profile,然后读取第一个存在而且町读的文件并且执行其中的命令"1 以在shell丿書动时使用-noprofile选项來禁止这种行为如果是以登录shell注销的,Bash会读取并执行文f|:*/.bash_logout和/etc/bash.bash」ogout中的命令, 假如文件存在的话交互式非登录shell的调用当要启动非登录交互式shell时,Bash读取并从~/.bashrc中执行命令,如果该文件存在的话可以使用 选项-norc來禁止这中情况选项-rcfilefile会强制Bash从file处读取并执行命令,而不是从~/.bashrc中 非交互式调用当Bash以非交互方式启动时,比如运行了一个shell脚本,Bash会在环境中查找变量BASH_ENV,如果 BASH_ENV存在的话,Bash就会扩展其值,并且使用该变量的值作为要读取和执行的文件名Bash的行 为犹如下面的命令执行后的结果:if [・n“$BASH_ENV" ]; then .“$BASH_ENV”; fi不过PATH变量中的值不会用來搜索该文件名。

      在shell中,环境的本质定义就是一个形如名称■值字符串数组构成的名称■值对列表Bash在处理一个 脚本时,会fork —个子shell并IL将环境变量中的值export到子shell中如果耍使用变量BASH_ENV來 指定Bash的启动文件的话,注意要使用文件的全路径,编者注)带有sh名称调用如果使川名称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模式。

      以POSIX模式调用当Bash进入posix模式时,比如使用了-posix命令行选项,bash对启动文件的处理遵循POSIX标准 在这个模式下,交互式shell扩展ENV变量,同时命令会从以变量扩展值作为名称的文件中读取并被执行 Bash不会再读取其它的启动文件被远程shell守护进程调用当运行时,Bash试图决定链接到网络连接上的标准输入,这些连接••般山远程shell守护进程,通常为rshd, 或者是由安全shell守护进程sshd发起如果Bash决定以这种方式运行,它会从-/.bashrc中读取并执行 命令,假如该文件存在而且可读的话如果以sh的方式调用的话,Bash就不会如此处理选项-norc可 以川来禁川上述的配置方式,同时-rcfile选项可以用来强制读取另外的文件,但是rshd —•般不会使用这些 选项來调用shell或者不允许这些指定这些选项有效和实际UID/GIDs不相等时的调用如果shell启动时,冇效用户(组)id同实际用户(纟n.)id不和等,同时・p选项未被支持,没冇任何启动文件会 被读取,shell的函数不会从坏境中继承,如果SHELLOPTS, BASHOPTS, CDPATH fil GLOBIGNORE 这些变量出现在环境中,都会被忽略掉,同时有效用户id会按照实际用户id的值来设置。

      如果在在调用时 支持了・p选项,Bash的启动行为是相同的,但是有效用户id不会被重置特别注意:在GNU Bash ,[,${N}被定义作位置参数(Positional Parameters), N为整数,但不含0,变量 $■和$0被当作特殊变量(Special Parameters)对待,编者注释) 由上述对Bash原牛文档的阐述,我们可以得到如下的结论:1. 在Bash中判断shell类型的最根本方式是查看特殊变量$•和$0的值,如果变量$0值的首字符是”■“的话, 则表示该shell是甥录shelL如果变量$■的值中含有字符”i”的话,则表示该shell是交互式shell如杲变量 PS1的值为空值则表示该shell是一个菲交互式shell使用脚木启动的shell的未必不是一个登录shell, 比如在脚本的shebang(脚本的首行)处增加-login选项2. 使得Bash成为交互式shell的两种方法:不用含有非选项的方式(比如指定了一个file作为调用参数)且没有使川・c选项来启动Bash启动Bash时指定了・i选项3•同交互式登录shell和带冇-login选项的菲交互式shell相关的配置文件如下所示,注意使用范朗 /etc/p rofi le对所有用户全局有效/etc/profile.d/该H录卜-有很多脚木,/etc/profile会将其中的文件都执行■遍~/.bash_profile以下3个配磴文件只对具体用户有效,而且有搜索顺序,只执行找第一个可以执 -/.bashjogi n 行的文件-/.profile4. 交互式非登shell的配置文件为~/.bashrc,只能够对具体用户生效,但是很多Linux发行版,比如RedHat会在-./.bashrc文件中执行文件/etc/bashrc中的内容,这样使得/etc/bashrc中的配置对 全体用户生效5. 使用sh script的方式來调用shell不同于bash script和./script,这在以上的说明中可以看出來,(H 是在CentOS ,|,/bin/sh默认是指向/bin/bash的软连接。

      Bash是如何判断是否以sh的方式调用H己 的呢,这点没想明白,还望高人指点6. 如果Bash以-•个非交互式shell启动,比如crond用动了 一个自动执行的脚本,Bash是不会读取任 何原先讲述的那些启动配置文件的,当然如果给脚木削加-login选项,那么Bash是会读収登录shell 的启动配置文件的7. 查看/etc/bashrc,发现里面有执行/etc/profile.d/H录卜-所有脚本的段落莫实更新bash程序以后 (比如yum升级),/etc/profile文件会被新的Bash程序所更新,但是/etc/profile.d/中的脚木就不会 受到彩响,所以考虑把同Bash无关的一些全局配置放到这儿8. 先來看卜 CentOS6 中~/.bash_profile、~/.bashrc/、/etc/bashrc 这几个文件的片段:~/.bash_profile 文件# Get the aliases and functionsif [ -f ~/.bashrc ]; then.-/.bashrcfiT.bashrc/ 文件# Source global definitionsif [ -f /etc/bashrc ]; then./etc/bashrcfi/etc/bashrc 文件# Only display echos from profile.d scripts if we are no login shell# and in teractive 一 otherwise just process them to set en warsfor i in /etc/profile.d/*.sh; doif [-r “$i” ]; thenif [“$PS1"]; then.“$i”else.“$i” >/dev/null 2>&1fifidone这儿个文件的配置片段讲得很淸楚,~/.bash_profile会去读取并执行-/.bashrc中的配置,-/.bashrc会去读取并执行/etc/bashrc中的配置,ifu/etc/bashrc则会判断当前的shell是否为交互式 shell,如果是的话就去执行目录/etc/profile.d/ H的所冇以sh为扩展名的脚本。

      也就是说,在 CentOS6的系统中(也可以理解为RedHat),如果Bash当作交互式非登录shell调用时,最终同样会 执行/etc/profile.d忖录中的环境初始化脚本;如果Bash当作交互式登录shell或者带有-login选项 调用时,也会访问~/.bashrc和/etc/bashrc文件执行流程类似如下过程:交互式登录shell,/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.