Bash 的若干基本问题

 
这里介绍一些bash启动前、后的问题,以及一些使用bash需要注意的基本问题。
 
 
1、Bash的介绍
 
Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件。
一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来。
当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来。或者也可以通过echo $SHELL来查看。
 
2、内部命令与外部命令
 
Bash中可用的命令分为两类,分别是:内部命令和外部命令。内部命令是Bash的一部分,而外部命令都是一个一个独立于Bash的软件。
在bash的用户提示符下,可以输入内部命令和外部命令,然后bash会分析命令,之后执行命令。bash执行内部命令不会产生新的进程,而在执行外部命令的时候,bash会用fork函数生成一个新的进程,然后用exec函数来加载这个外部命令的程序来执行这个外部命令。
怎么来区分一个命令是内部命令还是外部命令呢?用type命令来区分。type本身是一个内部命令,type commandName可以知道commandName这条命令的是内部命令还是外部命令。
 
3、环境变量与用户自定义变量
环境变量是对所有的进程(包括bash的进程和非bash的进程)都可见的变量,一般用大写字母的组合作为变量名,所以也称为全局变量。
 
环境变量和用户自定义变量的主要区别是:环境变量会被bash启动的子进程继承,而自定义变量不会被bash的子进程继承。
 
名词解析:临时环境变量和永久环境变量。其实全局变量都是通过export导出的变量。
临时全局变量是在bash的命令提示符下或者bash scripts下用export导出的变量,这些变量在机器重启之后会消失,除非再次执行export命令或者再次执行相应的scripts。
永久环境变量是写在配置文件中的,这些配置文件在每次重启机器甚至重开一个bash的时候都会被再执行一次,所以这些文件中的全局变量一直存在,不会因为重启机器而消失,看上去好像是永久的,其实是每次都重新export了。
 
用户自定义变量是对单个Bash可见的变量,其他任何从拥有这个变量的Bash生成的子进程(包括子bash进程和其他的子进程)都看不到这个变量,所以也称为局部变量。
系统中的环境变量,可以用env命令和export命令来查看。在bash的命令提示符下直接输入env或者export都将列出系统的所有环境变量。
在bash下输入set命令既可以看到系统的环境变量,也可以看到此bash所拥有的用户自定义变量,另外列出的变量中还有一些是与bash的操作接口有关的变量。
 
4、shell scripts的执行方式
 
bash脚本程序的执行方式,一种是由本bash来分析scripts,然后执行,第二种是另外启动一个新的bash进程,由新bash进程来分析和执行scripts。
在本bash中分析和执行scripts的做法,用source命令或者点命令来执行:
[zzl@myhost Scripts]$ source test.sh
[zzl@myhost Scripts]$ . test.sh
 
另起一个bash进程执行,有两种方式:
[zzl@myhost Scripts]$ bash test.sh
 
[zzl@myhost Scripts]$ chmod a+x test.sh (这里需要在test.sh的开头注明将要使用的shell)
[zzl@myhost Scripts]$ ./test.sh
 
5、Bash下的单个命令的交互执行过程
 
用户在bash的命令提示符下输入一条命令,bash就解释执行一条,这种方式成为交互式。
交互式的情况下内部命令的执行:用户输入了一条内部命令之后,bash分析命令,直接执行。执行内部命令相当于执行bash的一个函数。
交互式的情况下外部命令的执行:用户在命令行输入一条命令后,bash会分析这条命令的合法性,之后会fork出一个新进程,并在新进程中exec这条命令的程序。
 
6、shell scripts的执行过程
bash中scripts的执行过程与执行方式有关系。当用source或者点命令时是由本bash来执行此scripts的,如果是由bash命令或者直接执行脚本,则是另起一个子bash进程来执行scripts的。
 
那么一个bash进程或者bash的子进程又是怎么执行scripts的呢?
[zzl@myhost Scripts]$ source test.sh
这条命令执行后,当前bash会把test.sh当成一个命令行参数读入,之后从test.sh中读取一条、分析一条、执行一条,直至全部执行完毕。
 
[zzl@myhost Scripts]$ bash test.sh
这条命令执行后,当前bash会另外启动一个子bash进程,子bash把test.sh当成自己的命令行参数读入。
之后,子bash会从test.sh中读取一条,分析一条,执行一条。在这个过程中,如果读取的是内部命令,直接调用自己的对应函数;如果读取的是一个外部命令,那么它会fork一个子进程,然后在子进程中exec这个外部命令的程序,执行它。
直到test.sh中所有的命令都执行完了,子bash会结束,返回到当前bash中。
 
6、Bash的操作环境
 
登录系统前的欢迎信息放在/etc/issue中、登录后想要显示的信息放在/etc/motd中。
 
login shell:在进入bash的时候,经过了完整的输入用户名和密码的登录过程,之后才进入bash,那么这个bash叫做login shell。
 
non login shell:在进入bash的时候,不需要经过登录过程,那么这个bash就是non login bash。比如,在X Window下,打开一个terminal终端,之后进入的bash,就是non login shell;又不如,在命令提示符下输入bash,之后进入的bash也是non login shell。
 
login shell在进入之前要读取/etc/profile、~/.bash_profile或~/.bash_login或~/.profile等配置文件,而在~/.bash_profile中又会执行~/.bashrc文件。
non login shell在进入之前只会读取~/.bashrc文件。
 
login shell在注销退出的时候会读取~/.bash_logout配置文件的内容,而non login shell则不会读取。
 
~/.bash_history文件记录了上次及以前的会话中login shell使用过的命令。
 
 
 
以上基本问题搞清楚了,bash的使用过程中很多问题就清楚了。余下的问题是Bash内的问题,就是怎么学习bash脚本编程的问题和各个命令的用法问题了。
 
 
 
 

Bash 的若干基本问题的更多相关文章

  1. 生产力工具:shell 与 Bash 脚本

    生产力工具:shell 与 Bash 脚本 作者:吴甜甜 个人博客网站: wutiantian.github.io 注意:本文只是我个人总结的学习笔记,不适合0基础人士观看. 参考内容: 王顶老师 l ...

  2. Linux操作命令(四)

    本次实验将介绍 Linux 命令中 which.whereis.locate 命令的用法. which whereis locate 1.which which命令的作用是,在PATH变量指定的路径中 ...

  3. vim_action

    读取文件,显示行号 nl -a.txt brace expansion 花括号扩展 echo a{A{1,2},B{3,4}}b mkdir {2009...2011}-0{1...9} {2009. ...

  4. Linux部分常用命令学习(一)

    什么是linux命令? 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样. 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写 ...

  5. TLCL

    参考阅读:http://billie66.github.io/TLCL/book/chap04.html 绝对路径 An absolute pathname begins with the root ...

  6. (四)linux 学习 --使用命令

    The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap06.html 文章目录 什么是命令 是哪一种 ...

  7. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  8. 高级Bash Scripting系列笔记--01之“什么情况不适用Bash Script”

      1. 占用资源的任务,尤其那些影响速度的工作 比如排序,哈希,递归等等. 2. 大量使用数学运算 尤其是浮点运算,比如任意精度的计算或者复数计算等等,这类使用C++会好很多. 3. 跨平台的(适用 ...

  9. Bash 的 no-fork 优化

    我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序.fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 ...

随机推荐

  1. JavaScript高级程序设计(学习)

    文档模式是:混杂模式和标准模式. 若在文档开始处没有文档类型声明,则浏览器就会开启混杂模式.这种模式在不同的浏览器下行为差异非常大,如果不使用某些hack技术,跨浏览器的行为根本就没有一致性可言. 局 ...

  2. Spring-java代理技术总结

    Spring 中采用JDk的动态代理和CGLib代理技术在运行期间织入增强,所以用户不需要装备特殊的编译器或者类装载器就可以使用AOP功能. 要使用jdk的动态代理,目标类必须实现接口,而CGLib代 ...

  3. 安装prometheus+grafana监控mysql redis kubernetes等

    1.prometheus安装 wget https://github.com/prometheus/prometheus/releases/download/v1.5.2/prometheus-1.5 ...

  4. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  5. Meta http-equiv属性详解

    http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...

  6. require include php5中最新区别,百度上好多错的。

    二者报错机制不同,include是warning 继续执行程序,require会报致命错误,中断程序运行. 前者有返回值,后者则没有. 注意了,php5里有一个区别没了,之前说的是require是无条 ...

  7. Java 垃圾回收(GC) 泛读

    Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要 ...

  8. UNIX基础上

    时光飞逝,转眼已经毕业快2年了,觉得自己学的东西多却不精.对此深深的思考一下,觉得有必要连载unix环境编程文章,以此激励自己学习.在此立贴为证,2天一篇博客从零开始阐述unix的环境编程. 参考书籍 ...

  9. WSDL/WebService/SOAP/REST/AXIS/CXF 开放式服务

    WebService是一种数据交换标准.通过WebService标准,你可以把项目中的方法作为接口提供给其他项目使用. 有时候我们习惯性地将具体提供服务的某个方法称为WebService.比如图书系统 ...

  10. Uva 679 Dropping Balls (模拟/二叉树的编号)

    题意:有一颗二叉树,深度为D,所有节点从上到下从左到右编号为1,2,3.....在结点一处放一个小球,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k ...