【Linux命令行】理解shell

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值