关于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; }
posted @ 2024-09-10 16:55  takenika  阅读(22)  评论(0)    收藏  举报