什么是 shell

shell 简介

shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的 shell 程序与其他应用程序具有同样的效果。

每个 Linux 系统的用户可以拥有他自己的用户界面或 shell,用以满足他们自己专门的 shell 需要。

不同版本

同 Linux 本身一样,Shell 也有多种不同的版本。主要有下列版本的 Shell:

  • (sh)Bourne Shell:是贝尔实验室开发的。
  • (bash)BASH:是 GNU 的 Bourne Again Shell,是 GNU 操作系统上默认的 shell。
  • (ksh)Korn Shell:是对 Bourne Shell 的发展,在大部分内容上与 Bourne Shell 兼容。
  • (csh)C Shell:是 SUN 公司 Shell 的 BSD 版本。
  • (zsh)Z Shell:The last shell you’ll ever need! Z 是最后一个字母,也就是终极 shell。它集成了bash、ksh 的重要特性,同时又增加了自己独有的特性。

不同的 Shell 语言的语法有所不同,所以不能交换使用。每种 Shell 都有其特色之处,基本上,掌握其中任何一种就足够了。

Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数 Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,在下面的文字中,我们可以看到 #!/bin/sh,它同样也可以改为 #!/bin/bash

由于这层原因在 Debian 中使用 .profile 文件代替 .bash_profile 文件以兼容不同的 Shell。

.profile(由 Bourne Shell 和 Korn Shell 使用)和 .login(由 C Shell 使用)两个文件是 .bash_profile 的同义词,目的是为了兼容其它 Shell。

相关概念

交互式 shell 和非交互式 shell

交互式模式就是 shell 等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为 shell 与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell 也终止了。

shell 也可以运行在另外一种模式:非交互式模式。在这种模式下,shell 不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell 也就终止了。

login shell 和 non-login shell

login shell:进入 bash 时需要完整的登陆流程的,就称为 login shell。

non-login shell:取得 bash 接口的方法不需要重复登陆的举动。比如我们登陆一个有可视化界面的 Linux 服务器后,右键启动终端 Terminal,此时这个终端接口是不需要输入账号与密码,那么这个启动的 shell 输入窗口就是 non-login shell。

查看和修改系统默认 shell

查看系统所有的 shell

# 命令:
cat /etc/shells# 输出:
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells./bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

查看当前窗口使用的shell版本

# 命令:
echo $SHELL# 输出:
>>>/bin/bash

查看系统用户默认shell

可以看出 root 用户用的是 sh,其他用户用的是 bash

# 命令:
cat /etc/passwd | grep sh# 输出:
root:*:0:0:System Administrator:/var/root:/bin/sh
_sshd:*:75:75:sshd Privilege separation:/var/empty:/usr/bin/false
_update_sharing:*:95:-2:Update Sharing:/var/empty:/usr/bin/false
_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash

修改系统默认 shell为 bash

chsh -s /bin/bash

系统环境变量设定文件分类

按照是否作用于 login shell 分类

我们可以将系统的环境变量设定文件分为 profile 和 *rc 两大类:

  • profile 一般用于 login shell
  • *rc 用于 non-login shell

按照作用范围优先级分类

一般在 /etc 目录下会有下面几个文件,作用范围是全局。

/etc/profile

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。

如果你有对 /etc/profile 有修改的话必须得重启你的系统才会生效,此修改对每个用户都生效。

/etc/bashrc

为每一个运行 bash shell 的用户执行此文件,当 bash shell 被打开时,该文件被读取,每次用户打开一个终端时,即执行此文件。

如果你想对所有的使用 bash 的用户修改某个配置并在以后打开的 bash 都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个 bash 即可生效。

另外在用户家目录下会有一些当前用户的配置文件,这些文件的作用范围则是用户级别。

~/.profile

每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的 .bashrc 文件。

此文件类似于 /etc/profile,也是需要需要重启才会生效,/etc/profile 对所有用户生效,~/.bash_profile 只对当前用户生效。

~/.bash_profile

在 Debian 中使用 .profile 文件代替 .bash_profile 文件以兼容不同的 shell。

.profile(由 Bourne Shell 和 Korn Shell 使用)和 .login(由 C Shell 使用)两个文件是 .bash_profile的同义词,目的是为了兼容其它 Shell。

~/.bash_login

同上

~/.bash_logout

.bash_logout 在退出 shell 时被读取。所以我们可把一些清理工作的命令放到这文件中。

~/.bashrc

该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。(每个用户都有一个 .bashrc 文件,在用户目录下)

此文件类似于 /etc/bashrc,不需要重启生效,重新打开一个 bash 即可生效,/etc/bashrc 对所有用户新打开的 bash 都生效,但 ~/.bashrc 只对当前用户新打开的 bash 生效。

~/.zprofile

.zprofile 是 .zlogin 的替代品,.zlogin 则在 login shell 的时候读取,比如系统启动的时候会读取此文件。

~/.zlogin

同上

~/.zlogout

.zlogout 退出终端的时候读取,用于做一些清理工作。

~/.zshrc

该文件包含专用于你的 zsh shell 的信息,当登录时以及每次打开新的 shell 时,该文件被读取。

按照是否依赖于具体的 shell 分类

另外,我们可以认为 /etc/profile 和 .profile 是系统特定的环境变量设定文件,不依赖于具体的 shell,而其他的配置文件则要依据具体的 shell,这取决于你使用哪个作为系统默认的 shell。

  • .bash_profile .bash_login .bashrc 依赖于 bash
  • .zprofile .zshrc 依赖于 zsh

不同 shell 的执行优先级

bash 的配置文件执行优先级

一般情况下,Linux 的默认 shell 是 bash,这也是 Linux 上最广泛使用的 shell。其执行优先级如下:

当系统的默认 shell 是 bash 的时候,对于 non-login shell,bash 会默认执行 .bashrc 文件。

对于 login shell,bash 会默认执行 .profile 文件,但是当系统有 .bash_profile 或 .bash_login 存在的时候则不会执行 .profile。

在刚登录 Linux 时:

首先启动 /etc/profile 文件;

然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login 或 ~/.profile 文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。

开始执行用户的 bash 设置:

如果 ~/.bash_profile 文件存在的话,一般会以下面的方式执行用户的 ~/.bashrc 文件。

在 ~/.bash_profile 文件中一般会有下面的代码:

# if running bash
if [ -n "$BASH_VERSION" ]; then# include .bashrc if it existsif [ -f "$HOME/.bashrc" ]; then. "$HOME/.bashrc"fi
fi

同样 ~/.bashrc 中,一般还会在文件的前面有以下代码,来执行 /etc/bashrc

if [ -f /etc/bashrc ] ; then. /etc/bashrc
fi

~/.bash_profile 是交互式、login 方式进入 bash 运行的。~/.bashrc 是交互式 non-login 方式进入 bash 运行的。通常二者设置大致相同,所以通常前者会调用后者。

上面这三个文件是 bash shell 的用户环境配置文件,位于用户的主目录下。其中 .bash_profile 是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有命令都会被 bash 执行。

.bashrc 文件会在 bash shell 调用另一个 bash shell 时读取,也就是在 shell 中再键入 bash 命令启动一个新 shell 时就会去读该文件。这样可有效分离登录和子 shell 所需的环境。但一般来说都会在 .bash_profile 里调用 .bashrc 脚本以便统一配置用户环境。

zsh 的配置文件查找优先级

mac 系统下,我们会安装 zsh 来代替系统默认的 bash,zsh 在用户体验方面有着更优秀的特性,比如色彩高亮,命令提示,智能补全,快速跳转等。

当系统的默认 shell 是 zsh 的时候:

  • 首先当系统启动的时候会执行 /etc/.profile 全局的配置文件
  • 之后会在用户级别执行 .zprofile,.zshrc 两个文件

当我们安装了 zsh 之后,一般会安装 Oh my zsh 这个扩展工具集,来丰富我们的日常操作。另外,可以参考下面的文章配置比较流行的 agnoster 主题。

  • https://blog.csdn.net/weixin_44294408/article/details/124742002

  • https://blog.csdn.net/weixin_31983133/article/details/112610463

执行优先级场景

  1. 图形模式登录时,顺序读取:/etc/profile 和 ~/.profile

  2. 图形模式登录后,打开终端时,顺序读取:/etc/.bashrc 和 ~/.bashrc

  3. 文本模式登录时,顺序读取:/etc/.bashrc,/etc/profile 和 ~/.bash_profile

  4. 从其它用户 su 到该用户,则分两种情况:

    (1)如果带 -l 参数(或 - 参数,-login 参数),如:su -l username,则 bash 是 login 的,它将顺序读取以下配置文件:/etc/.bashrc,/etc/profile 和 ~/.bash_profile。

    (2)如果没有带 -l 参数,则 bash 是 non-login 的,它将顺序读取:/etc/.bashrc 和 ~/.bashrc

  5. 注销时,或退出 su 登录的用户,如果是 longin 方式,那么 bash 会读取:~/.bash_logout

  6. 执行自定义的 shell 文件时,若使用 bash -l a.sh 的方式,则 bash 会读取行:/etc/profile 和~/.bash_profile,若使用其它方式,如 bash a.sh./a.shsh a.sh(这个不属于 bash shell),则不会读取上面的任何文件。

参考资料

[1] profile和bashrc的区别 https://www.cnblogs.com/Zzbj/p/15419982.html
[2] bashrc与profile的区别 https://blog.csdn.net/heybeaman/article/details/87289405
[3] Linux下profile和bashrc四种的区别 https://blog.csdn.net/ishulei/article/details/108237502
[4] Linux中profile、bashrc、/.bash_profile、/.bashrc、~/.bash_profile之间的区别和联系以及执行顺序 https://kernel.blog.csdn.net/article/details/45064705

profile 和 bashrc 的区别相关推荐

  1. Linux下profile environment bashrc的区别

    先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文.将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN ...

  2. Linux 环境变量PATH设置和查看etc/profile和bashrc的区别

    一.查看环境变量 echo $PATH echo有"显示.印出"的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH. PATH(一定是大写)这个变 ...

  3. Ubuntu中etc/profile和~./bashrc的区别

    etc/profile 代表的是系统环境变量 ~./bashrc 代表的是用户环境变量

  4. ubuntu中环境变量文件/etc/profile、.profile、.bashrc、/etc/bash.bashrc之间的区别和联系

    一 /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行****加粗样式.并从/etc/profile.d目录的配置文件中搜集shell的设置.所以如果你有 ...

  5. linux中profile文件作用,解析Linux系统中bashrc和profile文件的作用区别

    使用终端ssh登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处理. ...

  6. linux 下/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc 的区别

    linux 下/etc/profile./etc/bashrc.~/.bash_profile.~/.bashrc 的区别 /etc/profile./etc/bashrc.~/.bash_profi ...

  7. ubuntu环境变量相关文件/etc/profile,/etc/bash.bashrc,~/.profile,~/.bashrc区别

    2个profile都是绑定了用户的登录操作,用户登录则读取执行 2个bashrc都是绑定了用户的启动shell操作,用户开启shell则执行.所以一旦修改就需要重新登录方能生效. etc/下的文件/e ...

  8. /etc/profile 跟 ~/.bashrc ~/.bash_profile的区别

    个人总结   /etc/profile  设置全局变量   ~/.bashrc 用户变量(若没有设置则看全局变量) .bash_profile 文件中内容调用的是 ~/.bashrc文件 什么是交互式 ...

  9. Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)

    博客园 首页 新随笔 联系 管理 订阅 <div class="blogStats"><!--done--> 随笔- 556  文章- 38  评论- 77 ...

最新文章

  1. 命名实体识别的三中标注方法BIO,BIOES,BMES
  2. 如何“愚弄”人工智能?
  3. Tomcat权威指南-读书摘要系列6
  4. 制作centos安装u盘
  5. Python学习笔记(运算符)
  6. SQL Server如何制造大量测试数据
  7. 用JS中的cookie实现商品的浏览记录
  8. 【笑话】男生追女生的数学模型
  9. IBM人工智能系统赢得人机辩论比赛
  10. keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
  11. 傅盛认知三部曲之三:战略就是格局+破局
  12. p坚持csma协议 仿真‘_签了“三方协议”,还算应届毕业生吗!?
  13. word的小方框如何在里面打上对勾
  14. Android 手机号格式验证(正则)
  15. 安防工程管理和运维对系统效能重要性
  16. 上财计算机专业全国排名,2021软科财经类大学排名,上海财经遥遥领先,东财仅排第六...
  17. FTP voyager使用配置参考
  18. iOS-进程、线程、锁
  19. 林大锐格-算法-6121
  20. 管理科学:忽悠法求最大最小值

热门文章

  1. presto查询优化
  2. HTML学生个人网站作业设计:动漫网站设计——海贼王(8页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  3. 第十二章-硬盘介绍和磁盘管理 随堂笔记
  4. U盘下载不了大文件??是打开的姿势不对!
  5. poi 读取 excel 总行数 ,总列数 注意事项 lastRowNum 、lastCellNum
  6. 刺激战场S6赛季最全更新内容:这样的嘻哈套装、M416皮肤你喜欢吗?
  7. iOS多张图片合成一张
  8. 单片机串口接收的几种常用的数据处理方法
  9. linux dns chroot配置文件,rhce7 dns chroot 配置
  10. python输入以回车结束_python将回车作为输入内容的实例