原创

shell(二)

Sell不仅是一个CLI,同样也是一个时刻在运行的复杂互交程序。输入命令并利用shell来运行脚本可出现一些有趣又令人迷惑的问题,搞清楚shell进程与系统间的关系能够避开这些难题,甚至完全避免它们。

Sell的类型与其他用法

我们都知道Shell由于历史原因存在许多类型。而系统启动何种Shell则取决于用户ID的配置。在/etc/passwd中可查询到默认的shell程序。

file

除此之外,有的系统还存在最初的C Shell,ash的Debian版等等

默认的交互Shell会在用户登录终端时启动,而还有一个默认的shell是/bin/sh,用于需要在启动时使用的系统shell脚本。centOS系统直接将默认的sh软链在bash上

file

而在Ubuntu中,系统默认的shell是bash,而用户默认的shell是dash
file
file

Shell的父子关系

当在中断输入bash或等效于bash的其他命令时,就会创建一个新的shell,这个shell称为子shell,子shell的PPID就是父shell的PID。而在子shell基础上再执行bash则继续创建一个新的子shell。而这些子shell的关系是嵌套层叠的。通过exit可逐个退出这些子shell,注意当最后一个bash退出后系统也会退出。

注:生成子shell的成本不低,速度还会变慢,创建嵌套shell则更加

file
file

子Shell的用法

子shell一般用于多进程处理,使用命令列表or进程列表这种方式过于繁琐,就不放出来了。这里直接使用其他的一些子shell用法

后台模式:sleep命令。进程睡眠 后面假的数字参数表示睡眠秒数,如 sleep 300表示进程休眠5min。直接在终端输入时,会将当前会话暂停,等时间到了才会继续显示CLI提示符。

若想让他置入后台模式,在后面加&即可,如此可用ps -f查看该进程,使用jobs查看当前后台作业的进程

file

目前子shell的用法不再继续深入

Shell的内建命令

外部命令:存在与bash shell之外,创建时会衍生一个子进程。通常位于 /bin、/user/bin或/sbin、/user/sbin,如:ps
内建命令:与shell编译成一体,是shell的一部分。无需使用子进程执行。如 cd 和 type
注:有些命令既有内建也有外部,可通过具体具体文件去使用即可。如echo、pwd两种都可实现

history

跟踪记录使用过的命令,并可唤回使用,所有使用过的命令都记录在当前用户的家目录下的.bash_history文件内

file

通过直接执行history可拿到最近的100条命令,并且可以随意唤回重用最近的命令,节省时间,提高效率。

file

使用 ! +序号可唤回指定命令并直接执行,注意!和序号之间没有空格:

file

使用 !! 两个感叹号可直接唤回最近的命令并执行:

file

alias

命令别名,用于将命令设置一个别名,作为常用命令来使用,进而将键入量降到最低

例如我平时查询正在运行的项目,通常使用ps -aux | grep java来查询,显得非常繁琐,下面直接设置一个简短的别名来代替这个命令:

alias psj='ps -aux | grep java'

file

需要注意的是:这个别名只在当前shell进程有效,若想在所有进程有效,必须做特殊配置,这将在下文会讲到

file

Shell环境变量

环境变量的相关操作

用于存储有关Shell会话、工作环境的信息,在内存中存储好以便于程序或Shell便于访问,区分大小写。

全局变量:对应所有Shell会话以及子Shell均有效,基本使用大写字母。
局部用户定义变量:只对创建它们的Shell有效,使用小写字母

  • 查询:

查询全局变量:使用 envprintenv ,效果是一样的
单个全局变量:使用printenv nameecho $name
局部用户定义环境变量:无法单独查询,使用set查询某进程设置的所有按字母排序后的环境变量。包括全局+局部+用户,输出的内容较多

  • 创建:

局部用户定义变量:
直接使用=赋值即可,这里用的是bash的规则,等号两边不可存在空格。
局部用户定制变量只可在当前进程使用,其子进程也不能使用,当变量值有空格时,必须使用单引号括起

全局变量:
首先创建一个局部变量,再使用export导出至全局变量中即可

file

全局变量所有进程均可查看,而在子Shell中修改、删除或export全局变量时只对子进程有效,并不会影响父Shell中该变量的值

file

  • 删除全局变量
    使用unset name来删除全局变量

file

启动bash Shell的方式以及持久化环境变量

login shell
登录系统时,bash Shell作为登录shell启动,登录Shell从以下启动文件中读取命令:

/etc/profile

系统默认的主启动文件,内容大概长这样.一般不操作这个文件

file
file

这个文件包含了警告语句和一些for循环,循环主要用于读取/etc/profile.d目录下的所有文件,当登录系统时for循环会读取该目录下所有.sh文件。如此,把我们设置好的环境变量放置在此目录下,不论哪个用户登录系统,都会执行此目录下的文件。但是不要直接放在/etc/profile文件中,因为系统更新可能会导致/etc/profile文件更新从而丢失自定义环境变量。

file

$HOME/.bash_history
$HOME/.bash_logout
$HOME/.bash_profile
$HOME/.bashrc

这些是用户专属的启动文件,有些系统只有其中1~2个,用户自己可以编辑这些文件并添加自己的环境变量,并在每次启动bash shell时生效。

file

下面是用户下的./bash_profile,里面同样有一个for循环,来执行.bashrc文件的内容,那么这个.bashrc又是啥呢?

file

这个熟悉的单词就是别名的命令(另外一个是脚本函数)。由此可以知道,若想把alias命令的别名持久化,将命名设置放置在$HOME/.bashrc启动文件中,即可使其持久化。

file

交互式 shell进程

如登录后再命令行敲出bash。这样运行的shell不会像登录shell那样去访问/etc/profile文件,它只会检查$HOME下的.bashrc文件

非交互式shell
系统执行shell脚本时就是用的这种方式,没有提示符出现。

数组变量

其实就是用的bash的数组语法,可使用数组设置多个变量,变量间用空格隔开。且可以使用下标、* 等符号获取元素。用的较少

正文到此结束