Total Pageviews

Sunday, 10 January 2021

bashrc与profile的区别

 Linux Shell分为交互式shell与非交互式shell,以及login shell与non-login shell。

  • 交互式Shell指shell在启动后等待用户的输入,并且执行用户提交的命令,运行的结果也能够输出到终端显示给用户看。
  • 非交互式Shell指shell不与用户交互,不能直接请求用户的输入,而是读取存放在文件中的命令,也不能直接输出结果给终端用户看。当它读到文件的结尾,shell也就终止了。运行结果可以输出到文件进行查看。
  • Login Shell指在某用户由/bin/login登陆进系统后启动的shell,跟这个用户绑定。这个shell是用户登陆后启动的第一个进程。login进程在启动shell时传递第0个參数指明shell的名字,该參数第一个字符为”-“,指明这是一个login shell。比如对bash来说,启动參数为”-bash”。
  • Non-Login Shell指不需login而由某些程序启动的shell。传递给shell的参数,是没有“-”前缀的。

要识别一个shell是Login Shell还是Non-Login Shell,只需在该shell下执行echo $0命令,如果得到的是“-bash”,表示当前为Login Shell,如果得到的是“bash”,表示当前为Non-Login Shell。

例如:

  • 在Linux发行版的图形桌面打开的终端Terminal是Non-Login Shell(不需要输入用户名和密码,直接进入)。从这个终端直接执行bash命令打开一个新的终端,也不需要输入用户名密码就可以进入,因此也是一个Non-Login Shell。
  • 通过SSH登录到服务器,得到的Shell是Login Shell。从这个终端直接执行bash命令打开一个新的终端,不需要输入用户名密码就可以进入,因此是一个Non-Login Shell。
  • 在Linux的VGA登录界面,按Alt+F2/F3/F4…等切换到的命令行登录界面,登录后得到的shell为Login Shell。
  • 在某个Shell通过su XXXX(XXXX表示某个用户名,切换当前用户)命令得到的新shell,虽然需要输入密码,但得到的是一个Non-Login Shell。
  • 在某个Shell通过su – XXXX(XXXX表示某个用户名,切换当前用户)命令得到的新Shell,是一个Login Shell。

当bash以Login Shell方式打开时,会执行脚本/etc/profile和~/.profile(如果存在的话)。
当bash以Non-Login Shell方式打开时,会执行脚本/etc/bashrc和~/.bashrc(如果存在的话)。

另外:
(1)bash在读取/etc/profile后会读取各账户的个人配置文件,所读取的个人配置文件主要有三个:~/.bash_profile, ~/.bash_login, ~/.profile。其实bash在读取的时候只会读取的上述三个文件的其中一个,而读取的顺序则就是上面的顺序。也就是说bash会依次查找上述三个个人配置文件,且找到一个后,后续的文件便不再读取。

(2)当以non-login shell登录时,如果希望获取用户的环境变量,执行”source ~/.bash_profile”即可(.bash_profile根据情况也可能是.bash_login或.profile),而其中source可以用小数点替换,即”source ~/.bash_profile”等价于”. ~/.bash_profile”。source命令的解释可以自行搜索。

另外,如果打开系统的/etc/bashrc或/etc/profile文件,通常会看到对PS1/PS2/PS3的赋值:

PS1表示指的是打开一个Shell后的提示格式,可使用的变量如下:
/d 代表日期,格式为weekday month date,例如:”Mon Aug 1”
/H 完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
/h 仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
/t 显示时间为24小时格式,如:HH:MM:SS
/T 显示时间为12小时格式
/A 显示时间为24小时格式:HH:MM
/u 当前用户的账号名称
/v BASH的版本信息
/w 完整的工作目录名称。家目录会以 ~代替
/W 利用basename取得工作目录名称,所以只会列出最后一个目录
/# 下达的第几个命令
/$ 提示字符,如果是root时,提示符为:# ,普通用户则为:$
/[ 字符”[“
/] 字符”]”
/! 命令行动态统计历史命令次数

PS2一般使用于命令行里较长命令的换行提示信息,一个非常长的命令可以通过在末尾加“\”使其分行显示PS2多行命令的默认提示符,默认值是“>”,例如:

PS3与PS4用到的情况比较少。

No comments:

Post a Comment