关于shell
▶ 查看shell
shell 的类型有很多:https://www.cnblogs.com/takenika/articles/18405458 - ▶ 认识 shell
通过查看 $0 可以查看当前使用的 shell。
在用户登录文本命令行界面的时候,系统是会默认给用户分配一个shell环境的。通过查看 /etc/passwd 的最后一个字段可以查看到用户登录时候使用的初始的 shell 环境。
[root@server ~]# cat /etc/passwd
hp:x:1000:1000::/home/hp:/bin/bash
可见 hp 用户使用的 shell 是 /bin/bash。
环境变量 SHELL 存储的就是用户默认登录的shell。
[root@server ~]# echo $SHELL
/bin/bash
▷ 两个变量查看shell环境
两个变量:
$0:$0是用来查看当前 shell 的$SHELL:$SHELL是用来查看用户的默认登录shell的。
[root@server ~]# echo $0 ; echo $SHELL
-bash
/bin/bash
[root@server ~]# zsh
[root@server]~#
[root@server]~# echo $0 ; echo $SHELL
zsh
/bin/bash
在一行中执行多个命令可以通过 ; 来隔离。
▶ 创建一个新的shell环境-父shell与子shell
在之前通过在文本命令行界面直接输入想切换的shell环境就能直接进入该环境,创造出来的新环境的shell是在原来shell的基础上创建的,我们将之前的shell环境称为 父shell 而新创建出来的shell称为 子shell。
[root@server ~]# echo $0
-bash
[root@server ~]# zsh
[root@server]~#
[root@server]~# pstree
--snip--
├─sshd─┬─sshd───sshd───bash───zsh───pstree
--snip--
由 bash 切换到了 zsh 环境,通过 pstree 可以看到 ─bash───zsh───pstree,这证明了zsh是bash的子shell。
在 shell 脚本中,经常使用子shell来进行多线程处理,使用子shell的成本很高,会拖慢处理速度,在CLI界面中使用子shell并非是真正的多进程处理,因为终端控制着子shell的I/O。
▶ 子shell的用法
有一些好的使用方法来使用在shell。
▷ 后台模式
在 CLI 界面中在命令后面添加一个 & 使得命令进入后台。如 sleep 10&。
[root@server ~]# sleep 10&
[1] 2175
[root@server ~]#
[1]+ Done sleep 10
现实的输出是 [1] 2175。[1] 方括号的数字是 1,这是 后台作业 backfground job 号,后面的 2175 数字 是 进程ID 号。
在后台进程执行完后会显示 [1]+ Done sleep 10 这样的形式,当然如果是其他的进程还会输出他们特定的内容。
& 不但可以用在单个命令上,也可以用在进程列表上面,
[root@server ~]# (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)
1
[root@server ~]# (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)&
[1] 2221
[root@server ~]# 1
[1]+ Done ( sleep 2; echo $BASH_SUBSHELL; sleep 2 )
将进程列表置于后台模式,这样既可以在子shell中进行繁重的工作,同时也不会让子shell的I/O受制于终端。
▷ 协程
协程基本上就是将命令置于后台模式。这需要 coproc 命令。
corproc 这个命令默认会给你的后台进程一个名字 CORPROC,也可以自己取一个名字。
[root@server ~]# coproc my_job { sleep 5; } &
[1] 2224
[root@server ~]#
[1]+ Done coproc my_job { sleep 5; }

浙公网安备 33010602011771号