Bash 的若干基本问题

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的进程)都可见的变量,一般用大写字母的组合作为变量名,所以也称为全局变量。

名词解析:临时环境变量和永久环境变量。其实全局变量都是通过export导出的变量。

临时全局变量是在bash的命令提示符下或者bash scripts下用export导出的变量,这些变量在机器重启之后会消失,除非再次执行export命令或者再次执行相应的scripts。

永久环境变量是写在配置文件中的,这些配置文件在每次重启机器甚至重开一个bash的时候都会被再执行一次,所以这些文件中的全局变量一直存在,不会因为重启机器而消失,看上去好像是永久的,其实是每次都重新export了。

用户自定义变量是对单个Bash可见的变量,其他任何从拥有这个变量的Bash生成的子进程(包括子bash进程和其他的子进程)都看不到这个变量,所以也称为局部变量。

环境变量和用户自定义变量的主要区别是:环境变量会被bash启动的子进程继承,而自定义变量不会被bash的子进程继承。

系统中的环境变量,可以用env命令和export命令来查看。在bash的命令提示符下直接输入env或者export都将列出系统的所有环境变量。

在bash下输入set命令既可以看到系统的环境变量,也可以看到此bash所拥有的用户自定义变量,另外列出的变量中还有一些是与bash的操作接口有关的变量。

4、shell scripts的执行方式

bash脚本程序的执行方式,一种是由本bash来分析scripts,然后执行,第二种是另外启动一个新的bash进程,由新bash进程来分析和执行scripts。

在本bash中分析和执行scripts的做法,用source命令或者点命令来执行:

[[email protected] Scripts]$ source test.sh

[[email protected] Scripts]$ . test.sh

另起一个bash进程执行,有两种方式:

[[email protected] Scripts]$ bash test.sh

[[email protected] Scripts]$ chmod a+x test.sh (这里需要在test.sh的开头注明将要使用的shell)

[[email protected] 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的呢?

[[email protected] Scripts]$ source test.sh

这条命令执行后,当前bash会把test.sh当成一个命令行参数读入,之后从test.sh中读取一条、分析一条、执行一条,直至全部执行完毕。

[[email protected] Scripts]$ bash test.sh

这条命令执行后,当前bash会另外启动一个子bash进程,子bash把test.sh当成自己的命令行参数读入。

之后,子bash会从test.sh中读取一条,分析一条,执行一条。在这个过程中,如果读取的是内部命令,直接调用自己的对应函数;如果读取的是一个外部命令,那么它会fork一个子进程,然后在子进程中exec这个外部命令的程序,执行它。

直到test.sh中所有的命令都执行完了,子bash会结束,返回到当前bash中。

7、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脚本编程的问题和各个命令的用法问题了。

时间: 2024-08-02 11:03:21

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

Linux下which、whereis、locate命令详解

which 命令 which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置.它一般用来确认系统中是否安装了指定的软件. 命令格式: which 可执行文件名称 常用范例: 例一:确认是否安装了 gcc,可以使用如下命令: which gcc 例二:查看 cd 命令的位置路径,可以使用如下命令: which cd 命令可以是下面四种形式之一: 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样. 属于这一类的程序,可以编译成二进制文件,诸如用 C 和

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

什么是linux命令? 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样. 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等. 是一个内建于 shell 自身的命令.bash 支持若干命令,内部叫做 shell 内部命令 (builtins).例如,上面我本地环境中的cd命令,就是一个 shell 内部命令. 是一个 shell 函数.这些是小规模的 s

linux命令行解析(一)

1·which命令 作用是在PATH变量指定的路径中搜索可执行文件的所在位置,他一般用来确定系统中是否安装了指定的软件. 命令格式: which 可执行文件的名称 会返回该程序的路径. 注:shell内建命令不在PATH指定的目录中. 到底什么是命令? 命令可以是下面四种形式之一: 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样. 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,

一不小心,老司机又翻车了

作者:田逸([email protected]) 这几天一直忙着往proxmox集群里边迁移服务,进展还是比较顺利.通过整合资源,两个机柜的服务器,下架以后,就剩一个柜子了,后边再迁移一下,还能下架一些旧的配置低的服务器.因为机柜电源的限制,迫不得已还得下架一台有公网ip的旧服务器.为了保证可用性,临时在一台有redis应用的服务器上绑定了一个公网ip.然后开始部署keepalived及haproxy,但搞半天,没把keepalived给安装上,估计是centos版本的问题.确认了一下,就是不安

Linux操作命令(四)

本次实验将介绍 Linux 命令中 which.whereis.locate 命令的用法. which whereis locate 1.which which命令的作用是,在PATH变量指定的路径中搜索可执行文件的所在唔知.它一般用来确认系统中是否安装了指定的软件. [命令格式]:which 可执行文件名称 [常用参数]: [常用范例]: 1.确认是否安装了gcc which gcc 2.查看cd命令的位置路径 which cd 从上面的显示信息可以看到在实验楼的系统中 cd 是一个 shel

TLCL

参考阅读:http://billie66.github.io/TLCL/book/chap04.html 绝对路径 An absolute pathname begins with the root directory and follows the tree branch by branch until the path to the desired directory or file is completed. For example, there is a directory on you

马哥2016全新Linux+Python高端运维班-Linux 网络基础管理,包管理,bash脚本练习

本周作业内容: 1.请描述网桥.集线器.二层交换机.三层交换机.路由器的功能.使用场景与区别.     集线器:又称"HUB"主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上.它工作于OSI(开放系统互联参考模型)参考模型第一层,即"物理层".     二层交换机:工作于OSI模块的第2层(数据链路层),故称为二层交换机.可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录

Linux基础之bash脚本进阶篇-数组

数组 什么是数组? 计算机中的数组指的是具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型. 通俗点来说数组就是变量的一种,按现在的术语来说就是变量圈子中的一个,只不过这个变量圈子都是相同类型的变量并有一定的组织顺序. 数组的格式 array[key]=value array:表示数组变量的名称 key:表示数组元素的索引又称下标 value:表示key对应的数组元素的值 大体了解了什么是数组,下面就来了解下如何定义数组或如何创建数组 --------------------------

51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

Bash游戏V1 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得比赛. 例如N = 3,K = 2.无论A如何拿,B都可以拿到最后1颗石子. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行2个数N,K.中间用空格分隔.(1 <= N,K <= 10^9) Output 共T