shell相关知识1
Posted 扫驴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关知识1相关的知识,希望对你有一定的参考价值。
转自https://www.cnblogs.com/ting152/p/12554480.html
1.组命令
组命令,就是将多个命令划分为一组,或者看成一个整体。
用法 | 区别 |
---|---|
Shell 组命令的写法有两种: { command1; command2;. . .; } |
两种写法的重要不同:由 |
举栗 | |
将多条命令的输出重定向到out.txt文件 |
1.普通模式
2.使用组命令 { ls -l ;echo "test432";cat test.txt; }>out.txt (ls -l ;echo "test432";cat test.txt)>out.txt |
组命令与管道结合 |
(ls -l ;echo "test432";cat ../test.txt)|wc -l |
2.子进程
2.1 什么是子进程
子进程的概念是由父进程的概念引申而来的。在 Linux 系统中,系统运行的应用程序几乎都是从 init(pid为 1 的进程)进程派生而来的,所有这些应用程序都可以视为 init 进程的子进程,而 init 则为它们的父进程。
Shell 脚本是从上至下、从左至右依次执行的,即执行完一个命令之后再执行下一个。如果在 Shell 脚本中遇到子脚本(即脚本嵌套,但是必须以新进程的方式运行)或者外部命令,就会向系统内核申请创建一个新的进程,以便在该进程中执行子脚本或者外部命令,这个新的进程就是子进程。子进程执行完毕后才能回到父进程,才能继续执行父脚本中后续的命令及语句。
使用pstree -p
命令就可以看到 init 及系统中其他进程的进程树信息(包括 pid):
systemd(1)─┬─ModemManager(796)─┬─{ModemManager}(821) │ └─{ModemManager}(882) ├─NetworkManager(975)─┬─{NetworkManager}(1061) │ └─{NetworkManager}(1077) ├─abrt-watch-log(774) ├─abrt-watch-log(776) ├─abrtd(773) ├─accounts-daemon(806)─┬─{accounts-daemon}(839) │ └─{accounts-daemon}(883) ├─alsactl(768) ├─at-spi-bus-laun(1954)─┬─dbus-daemon(1958)───{dbus-daemon}(1960) │ ├─{at-spi-bus-laun}(1955) │ ├─{at-spi-bus-laun}(1957) │ └─{at-spi-bus-laun}(1959) ├─at-spi2-registr(1962)───{at-spi2-registr}(1965) ├─atd(842) ├─auditd(739)─┬─audispd(753)─┬─sedispatch(757) │ │ └─{audispd}(759) │ └─{auditd}(752)
2.2 创建子进程
创建子进程的方式 | 说明 | |
---|---|---|
|
|
组命令、命令替换、管道 |
|
举栗: |
|
2.3 子进程总结
子 Shell 虽然能使用父 Shell 的的一切,但是如果子 Shell 对数据做了修改,比如修改了全局变量,这种修改也只能停留在子 Shell,无法传递给父 Shell。不管是子进程还是子 Shell,都是“传子不传父”。
子 Shell 才是真正继承了父进程的一切,这才像“一个模子刻出来的”;普通子进程和父进程是完全不同的两个程序,只是维持着父子关系而已。
3.如何检测子shell与子进程
echo $$输出当前进程ID,echo $PPID输出父shell ID
命令 |
结果 |
结论 | |
---|---|---|---|
输出当前进程与父进程ID |
echo $$;echo $PPID |
34451 34450 |
|
子进程形式输出进程ID 子进程 |
bash echo $$;echo $PPID exit |
52886 34451 |
在普通的子进程中,$ 被展开为子进程的 ID |
组命令形式输出进程ID 子shell |
(echo $$;echo $PPID)
|
34451 34450 |
子shell和父shell中的ID是一样的 这是因为$ 变量在子 Shell 中无效!Base 官方文档说,在普通的子进程中,$ 确实被展开为子进程的 ID;但是在子 Shell 中,$ 却被展开成父进程的 ID |
管道形式输出进程ID 子shell |
echo "test" | { echo $$;echo $PPID; } |
34451 34450 |
|
进程替换形式输出进程ID |
read < <(echo $$ $PPID) $ echo $REPLY |
34451 34450 |
以上是关于shell相关知识1的主要内容,如果未能解决你的问题,请参考以下文章