Loading

Linxu Shell 介绍

Shell 的启动

每个用户的登陆自动启动的 Shell 在 /etc/passwd 文件中定义。例如我们可以使用 cat /etc/passwd 命令查看 root 用户在配置文件中配置默认启动的 Shell。从下图中可以看到,root 用户默认启动的 Shell 是 /bin/bash 这个 Shell。

Shell 的父子关系

在父 Shell 中执行 /bin/bash 命令会打开一个新的子 Shell,再执行命令的话就是在子 Shell中执行的。首先在当前 Shell 中执行 /bin/bash,然后再执行 ps --forest 命令查看进程关系,可以看到如下结果。这里显示有两个 Shell,它们的关系是父子关系,同时在子 Shell 中有一个 ps 进程,它是子 Shell 的子进程。可以使用 exit 命令退出当前 Shell,若当前 Shell 为登陆时创建的 Shell,则会退出登陆。

  • 进程列表

    使用小括号包裹一组命令可以使该组命令成为进程列表,即启动一个子 Shell 来执行这组命令。可以通过命令 echo $BASH_SUBSHELL 来判断是否有子 Shell 生成。该命令返回 0 则表明没有子 Shell 生成;如果返回 1 或者更大值,则表明有子 Shell 生成。例如下面的命令 (pwd; echo $BASH_SUBSHELL)。它的返回值为 1 。表明有一个子 Shell。

  • 后台使用

    将进程置于后台模式,可以在子 Shell 中处理繁重的工作,同时不会让子 Shell 的 IO 受制于终端。例如利用 (tar -cf testuser.tar /home/testuser; tar -cf root.tar /home/root)& 后台进程创建备份文件。
    使用协程。协程可以同时做两件事。它在后台生层一个子 Shell,并在这个子 Shell 中执行命令。

    # 启动一个协程
    coproc cat
    # 往协程输入数据
    echo "hello" >& ${COPROC[1]}
    # 读取协程的输入数据
    read -u "${COPROC[0]}" a
    # 显示读取数据
    echo $a
    

参考

[1] : Linux 命令行和 Shell 脚本编程大全
[2] : Is coproc command the same as command &?
[3] : Bash编程之协作进程coproc

posted @ 2020-04-12 17:52  javadaydayup  阅读(135)  评论(0编辑  收藏  举报