shell和shell脚本

1、什么是shell和shell脚本

  Shell 本身是一个用 C 语言编写的程序,是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统,它是用户使用 Linux 的桥梁,是UNIX/Linux系统的用户与操作系统之间的一种接口。

  Shell既是一种命令语言,又是一种程序设计语言(shell脚本)。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

  它既是终端上的用户与UNIX/Linux操作系统交互的命令解释程序(shell命令)又是一种高级的命令程序设计语言(shell脚本)

  作为命令解释程序,shell接收用户输入的命令语言,将命令翻译成一个动作序列,然后调用系统过程执行这条命令。

  作为命令程序设计语言,shell具有一般高级语言的许多特征,如变量定义、赋值、条件和循环语句等。用户可以利用SHELL的这些功能将多条命令组织成一个命令程序,以完成某种特定的任务。这个命令程序称为shell程序或shell过程。

  由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?

  用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做shell

  Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

  Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。

2、shell命令与图形界面的区别

  对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。

  换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

  真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

3、Shell是如何连接用户和内核的

  Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。而接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

  比如,我们都知道在 Shell 中输入cat test.txt命令就可以查看 test.txt 文件中的内容,然而,test.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。

4、shell的分类
  Shell 是一个程序,一般都是放在/bin或者/usr/bin目录下(如下图中的bash),当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。

  通过 cat 命令来查看当前 Linux 系统的可用 Shell:

  在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。

  如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:

   输出结果表明默认的 Shell 是 bash。

  echo是一个 Shell 命令,用来输出变量的值。SHELL是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。 

  不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有sh、ash、bash、csh、tcsh、ksh、zsh等,不同的shell都有自己的特点以及用途。

  (1)sh

  sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。

  sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

  (2)csh

  sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。

  Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。

  BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。

  (3)tcsh

  tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

  (4)ash

  一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

  (5)bash

  bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。

  尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。

5、进入shell的两种方式

  在 Linux 发展的早期,唯一能用的工具就是 Shell,Linux 用户都是在 Shell 中输入文本命令,并查看文本输出;如果有必要的话,Shell 也能显示一些基本的图形。而如今 Linux 的环境已经完全不同,几乎所有的 Linux 发行版都使用某种图形桌面环境(例如 GNOME、KDE、Unity 等),这使得原生的 Shell 入口被隐藏了,进入 Shell 仿佛变得困难起来。

  (1)进入 Linux 控制台

  一种进入 Shell 的方法是让 Linux 系统退出图形界面模式,进入控制台模式,这样一来,显示器上只有一个简单的带着白色文字的“黑屏”,就像图形界面出现之前的样子。这种模式称为 Linux 控制台(Console)。

  现代 Linux 系统在启动时会自动创建几个虚拟控制台(Virtual Console),其中一个供图形桌面程序使用,其他的保留原生控制台的样子。虚拟控制台其实就是 Linux 系统内存中运行的虚拟终端(Virtual Terminal)。

  从图形界面模式进入控制台模式也很简单,往往按下Ctrl + Alt + Fn(n=1,2,3,4,5...)快捷键就能够来回切换。

  uabntu在启动时会创建7个虚拟控制台,按下crtl+alt+fn(n=1~7)可以来回切换,1~6为控制台模式,,7为图形界面模式。

  centos在启动时会创建6个虚拟控制台,按下crtl+alt+fn(n=1~6)可以来回切换,2~6为控制台模式,1为图形界面模式。

  下图就是进入了控制台模式:

  输入用户名和密码,登录成功后就可以进入 Shell 了。$是命令提示符,我们可以在它后面输入 Shell 命令。

  图形界面也是一个程序,会占用 CPU 时间和内存空间,当 Linux 作为服务器系统时,安装调试完毕后,应该让 Linux 运行在控制台模式下,以节省服务器资源。正是由于这个原因,很多服务器甚至不安装图形界面程序,管理员只能使用命令来完成各项操作。  

  (2)使用终端

  进入 Shell 的另外一种方法是使用linux桌面环境中的终端模拟包(Terminal emulation package),也就是我们常说的终端(Terminal),这样在图形桌面中就可以使用 Shell。

  命令提示符的格式不是固定的,用户可以根据自己的喜好来修改,Shell 通过PS1和PS2这两个环境变量来控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。

  PS1 控制最外层的命令提示符格式,PS2 控制第二层的命令提示符格式。

  在修改 PS1 和 PS2 之前,我们先用 echo 命令输出它们的值,看看默认情况下是什么样子的:

  Linux 使用以\为前导的特殊字符来表示命令提示符中包含的要素,这使得 PS1 和 PS2 的格式看起来可能有点奇怪。下表展示了可以在 PS1 和 PS2 中使用的特殊字符。

  如果命令在第一行没有输入完,按回车键时会显示命令提示符“<”,表示命令没有输入完,继续输入

6、shell命令

  在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令

  Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

   更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

   大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。

   可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。


  (1)Shell 命令分为两种

  Shell 自带的命令称为内置命令内置命令的本质是一个内部函数,执行内置命令就是调用这个自带的函数。因为这些内置命令所对应的函数代码在 Shell 启动时已经被加载到内存了,所以内置命令的执行速度很快。

  Shell 外部命令的本质是一个应用程序,执行外部命令就是启动一个新的应用程序。因为外部命令要创建新的进程并加载应用程序的代码,所以外部命令的执行速度很慢。

  用户输入一个命令后,Shell 先检测该命令是不是内置命令,如果是就执行,如果不是就检测有没有对应的外部程序:有的话就转而执行外部程序,执行结束后再回到 Shell;没有的话就报错,告诉用户该命令不存在。

  内置命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了函数,外部命令后面附带的所有数据(所有选项和参数)最终都以参数的形式传递给了应用程序。

  不管是内置命令还是外部命令,它后面附带的数据最终都以参数的形式传递给了函数。实现一个命令的一项重要工作就是解析传递给函数的参数。

  shell是一个程序,/bin目录下的bash就是ubantu下默认的shell,在终端上输入命令(命令[选项][参数]),bash程序就会根据命令执行对应的函数,而编写.sh文件就相当于将多个命令连续执行。

  A、内置命令(ls、cd等)-----对应bash程序内部的函数

    shell 命令的基本格式:command [选项] [参数]

    []表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数。

    有些命令有些时候可以不带选项和参数,有些命令有些时候必须要带选项和参数。

      ls -l:-l就表示ls命令的选项
      cd code:code就是cd命令的参数,表示进入code目录
      echo -n "how are you":-n就是echo命令的选项,表示输出字符串后不换行,“how are you”就表示参数

    内置命令后面的选项和参数都是以空格分开的,空格分开几部分就表示几个参数,命令不属于参数,命令就相当于对应的函数,选项和参数就相当于函数中的参数。

    并且,命令后面附带的数据都是“原汁原味”地传递给了函数,比如ls -l要传递的参数分别是 -l,减号-也会一起传递过去,在函数内部,减号-可以用来区分该参数是否是命令的选项。

    内置命令不宜过多,过多的内置命令会导致 Shell 程序本身体积膨胀,运行 Shell 程序后就会占用更多的内存。Shell 是一个常驻内存的程序,占用过多内存会影响其它的程序。

    只有那些最常用的命令才有理由成为内置命令,比如 cd、kill、echo 等;你可以转到《Shell内置命令》来了解所有的内置命令,以及如何判断一个命令是否是内置命令。

    常用的命令为使用shell界面开发用户程序必须用到的命令,大致可以分成五大类:

     (1)文件管理类:cd,chmod,chown,chgrp,comm,cp,crypt,diff,file,find,In,ls,mkdir,mv,cd,pr,pwd,mv,mvdir。

     (2)进程管理类:at,kill,mail,nice,nohup,ps,time,write,mesg。

     (3)文本加工类:cat,crypt,grep,norff,unlq,WC、sort,spell,tail,troff。

     (4)软件开发类:CC,f77,login,logout,size,yacc,vi,emacs,dbx、lex,make,lint,ld。

    (5)系统维护类。date,man,passwd,stty、tty,who等。

  B、外部命令(执行其它程序)------bash外部的程序

    外部命令可能是读者比较疑惑的,一个外部的应用程序究竟是如何变成一个 Shell 命令的呢?

    应用程序就是一个文件,只不过这个文件是可以执行的。既然是文件,那么它就有一个名字,并且存放在文件系统中。

    用户在 Shell 中输入一个外部命令后,只是将可执行文件的名字告诉了 Shell,但是并没有告诉 Shell 去哪里寻找这个文件。难道 Shell 要遍历整个文件系统,查看每个目录吗?这显然是不能实现的。

    为了解决这个问题,Shell 在启动文件中增加了一个叫做 PATH 的环境变量,该变量就保存了 Shell 对外部命令的查找路径,如果在这些路径下找不到同名的文件,Shell 也不会再去其它路径下查找了,它就直接报错。

  我们使用 echo 命令输出 PATH 变量的值,看看它保存了哪些检索路径:

  不同的路径之间以:分隔。根据上图可知,Shell 只会在几个固定的路径中查找外部命令。

  所以将编译生成后的可执行文件放入外部命令路径,比如放入/use/local/bin/中,就可以直接按命令执行。

7、shell过程

   一个shell过程是由能执行一个特定任务的一条或多条命令组成的。shell过程本身就是一个文件,通过系统中的编辑工具(如vi等)产生。与其他文件不同的是,它不需要编译就可以执行。

   shell过程在调用时可以带参数,这种参数称为命令行参数,它们与shell过程中的位置参数($1,$2,…,$9)相对应。如:shcmd X Y Z

   则shell过程shcmd中的位置参数$1对应命令行参数“X”,$2对应“Y”,$3 对应“Z”。

8、Shell脚本语言

   Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本,但是要知道,shell 和 shell script 是两个不同的概念。"shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

  有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)

  而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器

  编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

  Shell 编程语言就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

9、shell变量

   Shell提供了四类字符串变量,它们是:

   (1)位置变量

   如$0,$1,…,$9等,其中$0为shell过程名,$1到$9分别为过程名后的参数。

   (2)用户定义的变量

   变量名由字母、数字等组成,变量的值为字符串。变量通过赋值语句进行定义。在SHELL过程中,通过“$变量名”的方式来引用变量的值。

   (3)专用变量

   这些变量对于SHELL具有特殊的含义。如变量HOME被初始化为用户的登录目录,PATH为shell查找命令时所使用的查找路径等。这些变量的值可以直接在shell过程中引用,也可以由用户重新定义。

   (4)预定义变量

   这些变量具有特殊的含义,用户在程序中只能引用,而不能对它们进行修改。如$#记录传送给shell过程的参数个数,它不包括$0

10、Shell脚本编程

  Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

     if...else 选择结构,case...in 开关语句,for、while、until 循环;
    变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
    函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。

  站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。

  Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。

  使用 Shell的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。

  尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

  使用vim编辑器打开后缀名为.sh的文件,.sh表示shell脚本文件,如下图所示:

   #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置。

  Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。

  在新进程中运行 Shell 脚本有多种方法:

  (1)将 Shell 脚本作为程序运行

  Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限),如下所示:

  chmod +x表示给 test.sh 增加执行权限。./表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test1.sh,而系统路径下显然不存在这个脚本,所以会执行失败。

  通过这种方式运行脚本,脚本文件第一行的#!/bin/bash一定要写对,好让系统查找到正确的解释器。

  (2)将 Shell 脚本作为参数传递给 Bash 解释器

  直接运行 Bash 解释器,将脚本文件的名字作为参数传递给 Bash,通过这种方式运行脚本,不需要在脚本文件的第一行指定解释器信息,写了也没用。如下所示:


  更加简洁的写法是运行 bash 命令。bash 是一个外部命令,Shell 会在 /bin 目录中找到对应的应用程序,也即 /bin/bash。如下图所示:


  这两种写法在本质上是一样的:第一种写法给出了绝对路径,会直接运行 Bash 解释器;第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。

  在当前进程中运行shell:

  这里需要引入一个新的命令——source 命令。source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。
  source 命令的用法为:source filename

  也可以简写为:. filename(注意:点后面有空格)

  两种写法的效果相同。使用 source 命令不用给脚本增加执行权限,并且写不写./都行,对于第二种写法,注意点号.和文件名中间有一个空格。

11、shell的四种运行方式(启动方式)

  Shell 是一个应用程序,它的一端连接着 Linux 内核,另一端连接着用户。Shell 是用户和 Linux 系统沟通的桥梁,我们都是通过 Shell 来管理 Linux 系统。

  我们可以直接使用 Shell,也可以输入用户名和密码后再使用 Shell;第一种叫做非登录式,第二种叫做登录式。

  我们可以在 Shell 中一个个地输入命令并及时查看它们的输出结果,整个过程都在跟 Shell 不停地互动,这叫做交互式。我们也可以运行一个 Shell 脚本文件,让所有命令批量化、一次性地执行,这叫做非交互式。
  总起来说,Shell 一共有四种运行方式:交互式的登录 Shell;交互式的非登录 Shell;非交互式的登录 Shell;非交互式的非登录 Shell。

  判断shell是否为交互式有两种方法:

  (1)查看变量-的值,如果值中包含了字母i,则表示交互式(interactive)。

  (2) 查看变量PS1的值,如果非空,则为交互式,否则为非交互式,因为非交互式会清空该变量。

  判断 Shell 是否为登录式:

  判断 Shell 是否为登录式也非常简单,只需执行shopt login_shell即可,值为on表示为登录式,off为非登录式。

  shopt 命令用来查看或设置 Shell 中的行为选项,这些选项可以增强 Shell 的易用性。


  同时判断交互式、登录式:

  要同时判断是否为交互式和登录式,可以简单使用如下的命令:echo $PS1; shopt login_shell或者echo $-; shopt login_shell

  常见的 Shell 启动方式

  (1) 通过 Linux 控制台(不是桌面环境自带的终端)或者 ssh 登录 Shell 时(这才是正常登录方式),为交互式的登录 Shell。

  (2)执行 bash 命令时默认是非登录的,增加--login选项(简写为-l)后变成登录式。

 

  (3)使用由()包围的组命令或者命令替换进入子 Shell 时,子 Shell 会继承父 Shell 的交互和登录属性。

  (4) ssh 执行远程命令,但不登录时,为非交互非登录式。
  $ ssh localhost 'echo $PS1;shopt login_shell'
  login_shell     off

  (5)在 Linux 桌面环境下打开终端时,为交互式的非登录 Shell。

12、shell配置文件

  无论是否是交互式,是否是登录式,Bash Shell 在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。这个过程是通过加载一系列配置文件完成的,这些配置文件其实就是 Shell 脚本文件。

  与 Bash Shell 有关的配置文件主要有 /etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc、/etc/profile.d/*.sh,不同的启动方式会加载不同的配置文件。

  ~表示用户主目录。*是通配符,/etc/profile.d/*.sh 表示 /etc/profile.d/ 目录下所有的脚本文件(以.sh结尾的文件)。

  登录式的 Shell

  Bash 官方文档说:如果是登录式的 Shell,首先会读取和执行 /etc/profiles,这是所有用户的全局配置文件,接着会到用户主目录中寻找 ~/.bash_profile、~/.bash_login 或者 ~/.profile,它们都是用户个人的配置文件。

  不同的 Linux 发行版附带的个人配置文件也不同,有的可能只有其中一个,有的可能三者都有。

  如果三个文件同时存在的话,到底应该加载哪一个呢?它们的优先级顺序是 ~/.bash_profile > ~/.bash_login > ~/.profile。

  如果 ~/.bash_profile 存在,那么一切以该文件为准,并且到此结束,不再加载其它的配置文件。

  如果 ~/.bash_profile 不存在,那么尝试加载 ~/.bash_login。~/.bash_login 存在的话就到此结束,不存在的话就加载 ~/.profile。

  注意,/etc/profiles 文件还会嵌套加载 /etc/profile.d/*.sh。
  同样,~/.bash_profile 也使用类似的方式加载 ~/.bashrc。

  非登录的 Shell

  如果以非登录的方式启动 Shell,那么就不会读取以上所说的配置文件,而是直接读取 ~/.bashrc。

  ~/.bashrc 文件还会嵌套加载 /etc/bashrc,请看下面的代码.

 

 

posted @ 2020-02-20 23:06  孤情剑客  阅读(1273)  评论(0编辑  收藏  举报