Linux(27) profile和bashrc的区别

简介: Linux(27) profile和bashrc的区别

Linux shell环境简介

Linux shell是一个命令行界面,可以让我们与操作系统交互。它可以让我们执行各种命令,如查看文件,运行程序,管理进程等。Linux shell有多种类型,如Bash,Zsh,Ksh等。不同的shell有不同的特性和语法。但我们最常用的就只有Bash

Linux shell环境是指shell在执行命令时所依赖的一些参数和设置。这些参数和设置可以影响shell的行为和外观。例如:

  • 环境变量:是一些以名称和值对应的变量,可以在shell中使用或传递给其他程序。例如PATH变量存储了可执行文件的搜索路径,PS1变量存储了shell提示符的格式。
  • Shell配置:是一些用来定制shell功能和外观的命令或语句。例如alias命令可以定义命令的别名,function命令可以定义自定义函数。

Linux shell环境可以通过一些特殊的文件来设置和修改。这些文件通常位于某用户的主目录下(~),并以点(.)开头,表示隐藏文件。本文重点学习.profile文件和.bashrc文件记录。

Linux Shell和环境变量

Linux Shell概述

Linux Shell是一个程序,它接收用户输入的命令,并将其传递给操作系统执行。Shell还可以解释一些特殊的符号和语法,如重定向(>),管道(|),变量($),条件判断(if),循环(for),等等。这些符号和语法可以让编写更复杂和灵活的命令。

Linux Shell有多种类型,如Bash,Zsh,Ksh等。不同的Shell有不同的特性和语法。可以通过echo $SHELL命令来查看当前使用的Shell类型。例如:

$ echo $SHELL
/bin/bash

环境变量的作用和设置方法

环境变量是一些以名称和值对应的变量,可以在Shell中使用或传递给其他程序。环境变量可以影响Shell和其他程序的行为和输出。例如:

  • PATH变量存储了可执行文件的搜索路径,当输入一个命令时,Shell会按照PATH变量中指定的顺序在不同的目录中查找该命令。
  • PS1变量存储了Shell提示符的格式,当在Shell中输入命令时,提示符会显示一些信息,如用户名,主机名,当前目录等。
  • EDITOR变量存储了喜欢使用的文本编辑器的名称,当需要编辑一个文件时,一些程序会调用EDITOR变量中指定的编辑器。

可以通过echo命令来查看环境变量的值。例如:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

这表示PATH变量中包含了6个目录,用冒号(:)分隔。当输入一个命令时,Shell会先在/usr/local/sbin目录中查找该命令,如果没有找到,则继续在/usr/local/bin目录中查找,依此类推。

可以通过export命令来设置或修改环境变量的值。例如:

$ export PATH=$PATH:~/bin

这表示将/bin目录添加到PATH变量的末尾。这样就可以在任何地方执行/bin目录中的可执行文件了。

注意:export命令只能在当前Shell会话中生效。如果关闭或重新打开一个Shell窗口,则之前设置或修改的环境变量会失效。如果想让环境变量永久生效,则需要将export命令写入到一些特殊的文件中,如.profile文件或.bashrc文件。

理解.profile文件

.profile文件的作用和位置

.profile文件是一个用来设置和修改环境变量和Shell配置的文件。它通常位于用户的主目录下(~),并以点(.)开头,表示隐藏文件。可以通过ls -a命令来查看隐藏文件。例如:

$ ls -a
.  ..  .bash_history  .bash_logout  .bashrc  .profile

这表示root的主目录下其中一个就是.profile文件。

.profile文件的作用是在登录系统或打开一个登录Shell时,执行其中的命令。登录Shell是指需要输入用户名和密码才能进入的Shell,如终端模拟器,远程登录等。非登录Shell是指不需要输入用户名和密码就能进入的Shell,如图形界面下的终端窗口等。

.profile文件通常用来设置一些全局的环境变量和Shell配置,如PATH,PS1,EDITOR等。这些环境变量和Shell配置会对所有的Shell会话生效,无论是登录Shell还是非登录Shell。

如何创建和编辑.profile文件

如果主目录下没有.profile文件,可以通过touch命令来创建一个空的.profile文件。例如:

$ touch ~/.profile

这表示在主目录下创建了一个空的.profile文件。

如果想编辑.profile文件,可以使用任何喜欢的文本编辑器来打开它。例如:

$ vim ~/.profile

这表示使用vim 编辑器来打开.profile文件。

当编辑完.profile文件后,需要重新登录或重新加载.profile文件才能使修改生效。可以通过source命令或点(.)符号来重新加载.profile文件。例如:

$ source ~/.profile

或者

$ . ~/.profile

这表示重新加载了.profile文件中的命令。

.profile文件的常见用途和示例

.profile文件通常用来设置一些全局的环境变量和Shell配置,如PATH,PS1,EDITOR等。这些环境变量和Shell配置会对所有的Shell会话生效,无论是登录Shell还是非登录Shell。

例如,如果想将~/bin目录添加到PATH变量中,并将vim设置为默认的文本编辑器,并将Shell提示符改为显示当前时间和当前目录,则可以在.profile文件中添加如下内容:

# Add ~/bin to PATH
export PATH=$PATH:~/bin
# Set vim as default editor
export EDITOR=vim
# Customize shell prompt
export PS1="\t \w $ "

注意:每一行都以#开头的内容是注释,不会被执行。注释可以用来说明或解释代码的作用或意义。

保存并重新加载.profile文件后,就可以看到效果了。例如:

$ source ~/.profile
root@xxx:/# export EDITOR=vim
root@xxx:/# export PS1="\t \w $ "
04:14:54 / $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
04:15:06 / $ echo $EDITOR
vim
04:15:10 / $ cd /home/xxx/Documents/
04:15:28 /home/xxx/Documents $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
04:15:53 /home/xxx/Documents $ echo $EDITOR
vim

这表示成功地修改了PATH变量,EDITOR变量和PS1变量。

理解.bashrc文件

.bashrc文件的作用和位置

.bashrc文件是一个用来设置和修改环境变量和Shell配置的文件。它通常位于用户的主目录下(~),并以点(.)开头,表示隐藏文件。可以通过ls -a命令来查看隐藏文件。例如:

04:17:12 /root $ ls -a
.   .bash_history  .cache   .dbus   .profile  .viminfo
..  .bashrc        .config  .local  .vim      .wget-hsts

这表示主目录下有10个隐藏文件,其中一个就是.bashrc文件。

.bashrc文件的作用是在打开一个非登录Shell时,执行其中的命令。非登录Shell是指不需要输入用户名和密码就能进入的Shell,如图形界面下的终端窗口等。登录Shell是指需要输入用户名和密码才能进入的Shell,如终端模拟器,远程登录等。

.bashrc文件通常用来设置一些针对Bash Shell的环境变量和Shell配置,如alias,function,shopt等。这些环境变量和Shell配置只会对Bash Shell会话生效,不会影响其他类型的Shell。

如何创建和编辑.bashrc文件

如果主目录下没有.bashrc文件,可以通过touch命令来创建一个空的.bashrc文件。例如:

$ touch ~/.bashrc

这表示在的主目录下创建了一个空的.bashrc文件。

如果想编辑.bashrc文件,可以使用任何喜欢的文本编辑器来打开它 跟上面一样。例如:

$ vim ~/.bashrc

这表示使用vim编辑器来打开.bashrc文件。

当编辑完.bashrc文件后,需要重新打开或重新加载.bashrc文件才能使修改生效。可以通过source命令或点(.)符号来重新加载.bashrc文件。例如:

$ source ~/.bashrc

或者

$ . ~/.bashrc

这表示重新加载了.bashrc文件中的命令。

.bashrc文件的常见用途和示例

.bashrc文件通常用来设置一些针对Bash Shell的环境变量和Shell配置,如alias,function,shopt等。这些环境变量和Shell配置只会对Bash Shell会话生效,不会影响其他类型的Shell。

例如,如果想定义一些常用的命令别名,如ls -l为ll,grep --color=auto为grep等,并定义一个自定义函数calc来计算数学表达式,则可以在.bashrc文件中添加如下内容:

# Define some aliases
alias ll='ls -l'
alias grep='grep --color=auto'
# Define a function to calculate math expressions
calc() {
  echo "$*" | bc -l
}

注意:每一行都以#开头的内容是注释,不会被执行。注释可以用来说明或解释代码的作用或意义。

保存并重新加载.bashrc文件后,你就可以看到效果了。例如:

root@btf:/usr# ll
total 76
drwxrwxr-x   2 root root 36864 Aug  1  2023 bin
drwxr-xr-x   2 root root  4096 Sep  4 05:39 games
drwxr-xr-x  46 root root  4096 Sep  6 08:53 include
drwxrwxr-x  79 root root  4096 Feb 21 04:10 lib
lrwxrwxrwx   1 root root     3 Feb 21 04:10 lib64 -> lib
drwxr-xr-x   2 root root  4096 Sep  4 05:51 libexec
drwxrwxr-x  10 root root  4096 Feb 14 05:33 local
drwxrwxr-x   2 root root  8192 Feb 28  2022 sbin
drwxrwxr-x 180 root root  4096 Feb 14 06:05 share
drwxr-xr-x   2 root root  4096 Apr 15  2020 src
root@btf:/usr# export PATH=$PATH:~/bin
root@btf:/usr# export PS1="\t \w $ "
04:21:47 /usr $ calc "2+2*2"
6
04:21:53 /usr $

这表示成功地使用了别名和自定义函数。

.profile与.bashrc的区别

.profile与.bashrc的加载时机和条件

.profile文件和.bashrc文件的最大区别是它们的加载时机和条件不同。

.profile文件只在登录系统或打开一个登录Shell时,执行其中的命令。登录Shell是指需要输入用户名和密码才能进入的Shell,如终端模拟器,远程登录等。非登录Shell是指不需要输入用户名和密码就能进入的Shell,如图形界面下的终端窗口等。

.bashrc文件只在打开一个非登录Shell时,执行其中的命令。非登录Shell是指不需要输入用户名和密码就能进入的Shell,如图形界面下的终端窗口等。登录Shell是指需要输入用户名和密码才能进入的Shell,如终端模拟器,远程登录等。

这意味着,如果在图形界面下打开一个终端窗口,则只会执行.bashrc文件中的命令,不会执行.profile文件中的命令。如果在终端模拟器或远程登录中打开一个Shell,则只会执行.profile文件中的命令,不会执行.bashrc文件中的命令。

但是,有一个例外情况。如果在.profile文件中添加了如下内容:

# Load .bashrc if it exists
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

这表示让.profile文件在执行完自己的命令后,再去执行.bashrc文件中的命令(如果存在)。这样一来,无论打开的是登录Shell还是非登录Shell,都会执行.bashrc文件中的命令。这是一种常见的做法,可以让避免重复地在两个文件中写相同的命令。

.profile与.bashrc的适用场景

.profile文件和.bashrc文件的另一个区别是它们适用于不同的场景。

.profile文件通常用来设置一些全局的环境变量和Shell配置,如PATH,PS1,EDITOR等。这些环境变量和Shell配置会对所有的Shell会话生效,无论是登录Shell还是非登录Shell。因此,.profile文件适合存放一些通用且不经常变化的设置。

.bashrc文件通常用来设置一些针对Bash Shell的环境变量和Shell配置,如alias,function,shopt等。这些环境变量和Shell配置只会对Bash Shell会话生效,不会影响其他类型的Shell。因此,.bashrc文件适合存放一些个性化且经常变化的设置。

例如,如果想将~/bin目录添加到PATH变量中,并将vim设置为默认的文本编辑器,并将Shell提示符改为显示当前时间和当前目录,则可以在.profile文件中添加如下内容:

# Add ~/bin to PATH
export PATH=$PATH:~/bin
# Set vim as default editor
export EDITOR=vim
# Customize shell prompt
export PS1="\t \w $ "

如果想定义一些常用的命令别名,如ls -l为ll,grep --color=auto为grep等,并定义一个自定义函数calc来计算数学表达式,则可以在.bashrc文件中添加如下内容:

# Define some aliases
alias ll='ls -l'
alias grep='grep --color=auto'
# Define a function to calculate math expressions
calc() {
  echo "$*" | bc -l
}

.profile与.bashrc的相互关系

.profile文件和.bashrc文件之间有一种相互关系,即.profile文件可以调用.bashrc文件中的命令。

如果在.profile文件中添加了如下内容:

# Load .bashrc if it exists
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

这表示让.profile文件在执行完自己的命令后,再去执行.bashrc文件中的命令(如果存在)。这样一来,无论打开的是登录Shell还是非登录Shell,都会执行.bashrc文件中的命令。这是一种常见的做法,可以让避免重复地在两个文件中写相同的命令。

但是,反过来并不成立,即.bashrc文件不能调用.profile文件中的命令。这是因为.profile文件只在登录Shell时执行,而.bashrc文件只在非登录Shell时执行。如果.bashrc文件调用了.profile文件中的命令,那么在非登录Shell时,.profile文件中的命令会被执行两次,一次是由.profile文件本身执行,一次是由.bashrc文件调用执行。这可能会导致一些错误或冲突。

因此,.profile文件和.bashrc文件之间的相互关系是单向的,即.profile文件可以调用.bashrc文件中的命令,但.bashrc文件不能调用.profile文件中的命令。


希望这篇文章能对您有所帮助。如果还有其他问题或建议,请留言与私信。

相关文章
|
5月前
|
Linux Shell
在Linux中,umask 和 ulimit有什么区别?
在Linux中,umask 和 ulimit有什么区别?
|
8天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
39 18
|
5月前
|
安全 Linux 应用服务中间件
在Linux中,包过滤防火墙与代理应用防火墙有什么区别?有哪些相应的产品?
在Linux中,包过滤防火墙与代理应用防火墙有什么区别?有哪些相应的产品?
|
5月前
|
Linux 索引
在Linux中,符号链接与硬链接有何区别?
在Linux中,符号链接与硬链接有何区别?
|
4月前
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
105 3
|
5月前
|
缓存 Java 应用服务中间件
在Linux中,Tomcat和Resin有什么区别,工作中怎么选择?
在Linux中,Tomcat和Resin有什么区别,工作中怎么选择?
|
5月前
|
缓存 负载均衡 应用服务中间件
在Linux中,Squid、Varinsh和Nginx有什么区别,工作中怎么选择?
在Linux中,Squid、Varinsh和Nginx有什么区别,工作中怎么选择?
|
5月前
|
负载均衡 应用服务中间件 Linux
在Linux中,LVS、Nginx、HAproxy有什么区别?工作中怎么选择?
在Linux中,LVS、Nginx、HAproxy有什么区别?工作中怎么选择?
|
5月前
|
缓存 负载均衡 应用服务中间件
在Linux中,LVS与nginx有何区别?
在Linux中,LVS与nginx有何区别?
|
5月前
|
Linux 网络安全 数据安全/隐私保护
在Linux中,FTP 的主动模式和被动模式是什么?有何区别?
在Linux中,FTP 的主动模式和被动模式是什么?有何区别?