理解 bashrc profile 优先级及区别

为使Bash更好地为我们服务,我们需定制bash shell环境。

~/.bash_profile、~/.bashrc、和~/.bash_logout

  1. 上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。其中.bash_profile是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有命令都会被bash执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代替.bash_profile文件。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。
  2. .bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境。
  3. .bash_logout在退出shell时被读取。所以我们可把一些清理工作的命令放到这文件中。

/etc/bashrc和/etc/profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile 和.bashrc时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISTSIZE环境变量设置在历史记录文件里保存记录的条数。

  1. /etc/profile:是全局profile文件,设置后会影响到所有用户
  2. /home//.profile或.bash_profile是针对特定用户的,可以针对用户,来配置自己的环境变量。

当我们修改了这些配置件后,可用source .bash_profile命令使它修改内容马上生效。登录放到方式不同,使用的用户配件信息也不一样。

登录shell的类型:交互式登录和非交互式登录

交互式登录shell:

就是可以与shell进行交互,需要验证的登录。有:
1,通过控制台或远程连接,需要用户名,密码。
2,su - username(可看做交互式登录)
交互式登录依次读取的文件为:/etc/profile–>/etc/profile.d/*–>(~/.bash_profile | ~/.bash_login | /.profile)–>/.bashrc–>/etc/bashrc–>~/.bash_logout
这几种文件的作用分别是:
1,/etc/profile:当用户登录系统后,通常使用这个文件给给用户提供默认的环境。这个默认环境实际上就是一组环境变量的定义,最后会调用/etc/profile.d中的文件。文件作用于全部用户。文件中的各环境变量的意思如下:

  • PATH:根据UID设定PATH要不要到含有sbin的系统命令目录
  • USER:根据当前登陆用户名设置。
  • MAIL:根据用户账号设置当前用户的邮件存放目录。
  • HISTSIZE:是指保存历史命令记录的条数。
  • LOGNAME:是指当前用户的登录名。
  • HOSTNAME:内容是/bin/hostname,如果要用到主机名的话,通常是从这个环境变量中来取得的。INPUTRC:如果用户没有自定义输入的按键功能,则设置INPUTRC=/etc/inputrc,此文件定义bash的热键等数据,有的话就不设置。

2,/etc/profile.d:主要是对shell的设置,作用于全部用户。其中,这个目录文件中有一个lang.sh脚本会调用文件/etc/sysconfig/i18n,这是一个觉得我们bash默认使用何种语系的重要配置文件,文件中重要的是LANG变量的设置。
3,/.bash_profile:当用户登录时,该文件仅仅执行一次,默认情况下,他设置一些环境变量,执行用户的.bashrc文件,作用于当前用户。如果这个文件不存在会读取/.bash_login,这个文件还不存在的话读取~./profile。
4,~/.bashrc: 当用户登录时以及每次打开新的shell时,该该文件被读取。存有改用户的的所有的命令别名等;作用于当前用户。
5,/etc/bashrc:为运行bash shell的用户执行此文件,对bash进行设置.当bash shell被打开时,该文件被读取。作用于所有用户。
6,~/.bash_logout:当用户退出bash时读取该文件,执行一些操作。作用于当前用户。
登录shell:会首先读取和执行/etc/profile全局配置文件中的命令,然后依次查找/.bash_profile、/.bash_login 和 ~/.profile这三个配置文件,读取和执行这三个中的第一个存在且可读的文件中命令。除非被--noprofile选项禁止了。

非交互式登录shell:

就是用户获取shell后,一次性读取全部文件,不与用户进行交互。例:
1,su username(可看做非交互式shell)
2,执行脚本的shell
3,图形界面下打开的模拟shell

非交互式登录依次读取的文件为: ~/.bashrc–>/etc/bashrc–>/etc/profile.d/*
各文件对用户shell登录的作用和交互式登录时的作用相同(需要说明的是./bashrc文件会调用/etc/bashrc文件)

交互非登录式shell:

比如启动了一个bash shell而没有登入系统(如在CLI提示符中键入bash),或者Linux通过图形界面进入的终端。
只读取 ~/.bashrc 和 /etc/bashrc 文件。交互式非登录shell执行~/.bashrc文件中的命令在每次执行shell脚本时,都会重新读取这个文件,所以是最完整的。
不同的发行版里面可能有所不同,比如debain系列的是不同的,如ubuntu /etc/profile–>/etc/environment–>$HOME/.profile

非登录非交互式Shell:

比如一个crontab脚本、shell脚本、ssh 执行远程命令都是非登录非交互式Shell,没经过处理的话,既不是交互式Shell,也不是登录Shell,所以上不会执行 profile ,也不会执行 rc。怎么解决?比如可以把Sha-Bang改成#!/bin/bash -l变成登录式,让脚本用登录Shell来解释执行,就可以加载/etc/profile或者,调用Bash解释器,加-l参数也可以。

区别

profile

profile 是某个用户唯一的用来设置环境变量的地方,因为可能有多个 shell 比如 bash 或者 zsh,但环境变量只需要统一初始化就行,这就是 profile 的作用

bashrc

用来给 bash 做初始化的,bash 的代码补全,bash 的别名,bash 的颜色,以此类推也就还会有 shrc, zshrc
通常一个好的做法是

  • /etc/profile 是配置所有用户的
  • ~/.profile 中配置和 bash 命令不是直接相关的内容,比如环境变量等等
  • ~/.bashrc 中配置和交互式命令行相关的配置,比如命令自动补全,EDITOR 变量,bash aliases 别名等等
  • ~/.bash_profile 可以当做 ~/.profile 使用,只会被 bash 读取

不同类型shell的影响

对用户来说,shell的分类带来的最大影响莫过于启动时的配置了。
以bash为例,如果它作为登录shell运行,例如用户登录系统时,则会首先读取并执行/etc/profile里的命令。 接下来,它按下面的顺序寻找并读取启动配置文件:/.bash_profile、/.bash_login、~/.profile,遇到第一个存在且可读的就不再继续了。在bash作为登录shell退出时, 它还会读取并执行~/.bash_logout和/etc/bash.bash_logout中的内容。反之,如果bash以非登录shell运行,例如用户启动终端程序或运行脚本时,它就不会读取上述那些文件。
非登录shell读取哪些配置文件还取决于它交互的还是非交互的。启动一个交互终端时,bash会读取并执行它的运行控制(run control)文件,默认为~/.bashrc。 而运行脚本时由于是非交互的,上面那些文件都不会起作用,bash会转而读取并执行环境变量BASH_ENV指示的文件。
Bash之外的其他shell,具体执行细节可能有所差异,但基本符合一些大原则:登录shell会读取带profile、login关键字的配置文件,非登录的交互shell会读取带rc关键字的运行控制文件, 非登录的非交互shell只会根据env关键字的变量来进行初始化。
在使用shell的过程中,有时会奇怪为啥自己增加的启动代码没有起作用。这很可能是因为这些代码写在了一个当前shell实例根本不会去读取的文件里。 知道了shell的种类和不同种类shell的影响,就可以有的放矢地配置和使用shell了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bashrc 文件是在每次打开 bash shell 时执行的脚本,主要用来设置 bash 的环境变量。 profile 文件是在用户登录时执行的脚本,主要用来设置系统环境变量。 简而言之, bashrc 文件是针对于当前用户的 bash shell 的配置, 而 profile 文件是针对于整个系统所有用户的配置。 ### 回答2: .bashrc 和.profile 是两个不同的文件,用于配置用户登录shell的环境。它们的主要区别在于使用的shell类型和加载时间。 .profile 是用于 Bourne shell (bash、ksh) 以及 Bourne-compatible shell (sh) 环境的配置文件。当用户登录时,系统会首先读取.profile 文件,并按照其中的设置来初始化用户环境。该文件通常包含设置环境变量、定义别名、添加路径等操作。 .bashrc 是用于 bash shell 环境的配置文件。当用户在当前shell下执行新的bash子shell时,会读取.bashrc 文件来初始化子shell的环境。因此,它主要用于定义bash特有的配置和个性化设置,如命令别名、环境变量、shell提示符等。 由于.bashrc 是在.bash_profile 或 .profile 文件中被调用的,所以在创建新用户时,.profile 文件中通常会包含一行代码 ". ~/.bashrc" ,以确保.bashrc 的配置可以被正常加载。 总结来说,.profile 是Unix/Linux系统下通用的shell配置文件,适用于多种Shell环境;.bashrc 则是专门用于bash shell的配置文件,用于个性化设置bash特有的配置。 ### 回答3: .bashrc 和 .profile 都是在 Linux 和 Unix 操作系统中用来配置环境变量和用户个性化设置的文件。它们的区别在于作用范围和加载时机。 .bashrc 是一个特定于 Bash shell 的配置文件,它仅适用于当前用户的交互式 Bash shell。当用户登录时,.bashrc 会被加载并应用,包含用户自定义的环境变量、别名和其他个性设置。 .profile 是一个通用的配置文件,不仅限于特定的 shell。它适用于登录 shell,即用户登录时所使用的默认 shell。除了 Bash,还适用于其他 shell,如 sh、ksh 和 zsh 等。.profile 的作用范围更广泛一些,它可以设置用户的环境变量、添加路径、定义 shell 函数等。 由于加载时机不同,两者的主要区别在于在用户登录时加载的文件。当用户登录时,.profile 文件会先于 .bashrc 文件被加载。因此,如果用户在 .bashrc 文件中定义了与 .profile 文件中相同的变量或其他设置,那么在登录后打开的 Bash shell 中将会覆盖 .profile 中的设置。 总结来说,.bashrc 主要用于配置 Bash shell 的参数和设置,适用于交互式 Bash shell,而 .profile 是一个通用的登录 shell 配置文件,适用于多种 shell。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值