文章目录
1 shell的父子关系
进程:运行着的程序叫做进程
用户默认的交互shell
cat /etc/passwd| head - 3| awk -F : ‘{print $7}’
系统默认的shell
ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Aug 18 2017 /bin/sh -> bash
centos是bash
ubunto是dash
默认的交互shell是父shell
输入/bin/bash后启动子shell
$ps -f
UID PID PPID C STIME TTY TIME CMD
50485581 1054 1053 0 09:05 pts/3 00:00:00 -bash
50485581 3822 1054 0 09:18 pts/3 00:00:00 ps -f
1053是父进程 创建子进程1054 ,1054又创建子进程3822
$bash
$ps -f
UID PID PPID C STIME TTY TIME CMD
50485581 1054 1053 0 09:05 pts/3 00:00:00 -bash
50485581 4086 1054 0 09:19 pts/3 00:00:00 bash
50485581 4170 4086 0 09:20 pts/3 00:00:00 ps -f
1053创建子进程1054 ,1054创建子进程4086,4086创建子进程4170
通过ps --forest命令,可以看出进之间的嵌套关系
$ps --forest
PID TTY TIME CMD
1054 pts/3 00:00:00 bash
4086 pts/3 00:00:00 \_ bash
5805 pts/3 00:00:00 \_ bash
5850 pts/3 00:00:00 \_ bash
5903 pts/3 00:00:00 \_ ps
退出shell
$exit
exit
$exit
exit
$exit
exit
$ps --forest
PID TTY TIME CMD
1054 pts/3 00:00:00 bash
6432 pts/3 00:00:00 \_ ps
1.1 进程列表
命令列表:
一次执行多个命令,用分号
比如:
$pwd;ls;cd ~;pwd;ls
上面命令列表会依次执行
命令列表成为进程列表,要加上(),必须包含在括号里,这样会创建子进程,进程列表也叫命令分组
$(pwd;ls)
/home/50485581
a.txt nginx.log tesh.sh test
查看是否用了子进程
$(pwd;echo $BASH_SUBSHELL)
/home/50485581
1
1代表创建了子进程
$(pwd;(echo $BASH_SUBSHELL))
/home/50485581
2
括号里面有括号,代表启了2个子进程(shell)
子shell的作用:进行多进程处理,弊端:速度慢,并不是真正意义的子进程,是由终端控制着I/O
1.2 子shell用法
1.2.1 后台模式
将会话暂停5秒,再返回CLI提示符
$sleep 5
若想后台执行用&
$sleep 10 &
[1] 11165
- [1] 后台作业
- 11165 后台作业的进程ID
用ps查看
$ps -ef| grep sleep
50485581 11201 1054 0 09:51 pts/3 00:00:00 grep --color=auto sleep
[1]+ Done sleep 10
用jobs查看
[50485581@shell.testing-studio.com ~]$sleep 10 &
[1] 11817
[50485581@shell.testing-studio.com ~]$jobs
[1]+ Running sleep 10 &
-l显示进程的id,运行结束会有done的提示
$jobs -l
[1]+ 11817 Done sleep 10
1.2.2 将进程列表置于后台
$(sleep 5;echo $BASH_SUBSHELL;sleep 5)&
[1] 13073
$1
$
[1]+ Done ( sleep 5; echo $BASH_SUBSHELL; sleep 5 )
(sleep 5;echo $BASH_SUBSHELL;sleep 5)&
- 加上&表示在讲进程列表放在后台执行,第一次输出[1] 13073,作业和进程ID
- 1 表示有1个后台进程
- [1]+ Done ( sleep 5; echo $BASH_SUBSHELL; sleep 5 ) 再按下回车,返回状态
1.2.3 协程
协程:可以在后台生成一个子shell,在子shell执行命令
$coproc sleep 10
[1] 15204
$jobs -l
[1]+ 15204 Running coproc COPROC sleep 10 &
- 生成作业号和进程ID,
- coproc COPROC sleep 10 &,这是子shell中执行的后台命令,其中COPROC是coproc命令给进程起的进程名,也可以使用coproc的扩展语法
扩展语法:
$coproc process_1 { sleep 10; }
[1] 16513
$jobs -l
[1]+ 16513 Done coproc process_1 { sleep 10; } &
- 必须确保在第一个花括号({)和命令名之间有一个空格。还必须保证命令以分号(;)结尾。另外,分号和闭花括号(})之间也得有一个空格。
- process_1 是进程名
2 shell的内建命令
是外部命令还是内建命令可以用type来查看,查看外部命令的路径可以用which命令来查看,可以查看内建和外部命令列表
2.1 外部命令
外部命令也加文件系统命令,不是shell程序的一部分,在/bin、 /usr/bin、/sbin 、/usr/sbin中m,找到命令 用which
$which ps
/usr/bin/ps
$type -a ps
ps is /usr/bin/ps
$ls -l /usr/bin/ps
-rwxr-xr-x. 1 root root 100120 Nov 6 2016 /usr/bin/ps
外部命令执行会创建子进程,也叫衍生
$ps -f
UID PID PPID C STIME TTY TIME CMD
50485581 1054 1053 0 09:05 pts/3 00:00:00 -bash
50485581 26781 1054 0 11:07 pts/3 00:00:00 ps -f
2.2 内建命令
不需要有子进程,和shell编程成为一体
$type cd
cd is a shell builtin
$type exit
exit is a shell builtin
优点:速度快,效率高
即是内建又是外部的命令:type -a
$type -a echo
echo is a shell builtin
echo is /usr/bin/echo
$type -a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
2.2.1 history命令
默认是最近执行的1000条命令,可以修改环境变量:HISTSIZE来进行修改
$history | tail -n 10
1048 ps -f
1049 type cd
1050 type exit
1051 type jobs
1052 type -a echo
1053 type -a pwd
1054 history
1055 history | head 10
1056 history | head -n 10
1057 history | tail -n 10
!!命令唤回历史记录
$ps --forest
PID TTY TIME CMD
1054 pts/3 00:00:00 bash
29556 pts/3 00:00:00 \_ ps
[50485581@shell.testing-studio.com ~]$!!
ps --forest
PID TTY TIME CMD
1054 pts/3 00:00:00 bash
29604 pts/3 00:00:00 \_ ps
- 默认是最近执行的1000条命令
- 可以修改环境变量:HISTSIZE来展示最多显示的条数
- 历史命令存在在主目录下面有个隐藏文件.bash_history
!序列号 唤回某一行的命令
!911
pwd
/home/50485581
查看隐藏文件ls -a
统计隐藏文件的总数
$cat .bash_history| wc -l
1000
注意:
$pwd
/home/50485581
$pwd
/home/50485581
$cat .bash_history| tail -2
history
history | head 10
发现刚才运行的2个命令并没有写入到.bash_history中去,
原因:先放在内存里,当退出shell时才会写入到文件中去
强制写入到文件,使用history -a命令强制写入,然后再history
多个终端,history -a 只对第一个打开的终端有效,不接受其他终端的命令,更新其他终端的可以用history -n命令
2.2.2 alias
比如把经常使用的,比较长的命令,我们可以把它定义为别名,直接输入别名可以减少使用时间
alias -p 查看系统定义好的别名
$alias -p
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'