正文
10.1 Shell概述
1、Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序, 用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。 Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、Shell的分类
Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。 Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh
Bash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3、Linux支持的Shell
/etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
10.2 Shell脚本的执行方式
1、echo输出命令
[root@localhost ~]# echo [选项] [输出内容]
选项:
-e: 支持反斜线控制的字符转换
控制字符 作用
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数
[root@localhost ~]# echo -e "ab\bc"
#删除左侧字符
ac
[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"
#制表符与换行符
a b c
d e f
[root@localhost ~]# echo -e \
"\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
#按照十六进制ASCII码也同样可以输出
a b c
d e f
[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"
#输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2、第一个脚本
[root@localhost sh]# vi hello.sh
#!/bin/Bash
#The first program
# Author: shenchao (E-mail: shenchao@lampbrother.net)
echo -e "Mr. Shen Chao is the most honest man in LampBrother"
3、脚本执行
赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
通过Bash调用执行脚本
bash hello.sh
10.3 Bash的基本功能
10.3.1 历史命令与命令补全
1、历史命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件
~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
HISTSIZE=1000
历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
2、命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
10.3.2 命令别名与常用快捷键
1、命令别名
[root@localhost ~]# alias 别名='原命令'
#设定命令别名
[root@localhost ~]# alias
#查询命令别名
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'
命令执行时顺序
- 第一顺位执行用绝对路径或相对路径执行的命令。
- 第二顺位执行别名。
- 第三顺位执行Bash的内部命令。
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/composer:/home/vagrant/bin
让别名永久生效,修改家目录下的.bashrc
文件:
[root@localhost ~]# vi /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
删除别名
[root@localhost ~]# unalias 别名
2、Bash常用快捷键
快捷键 作 用
ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
ctrl+E 把光标移动到命令行结尾。
ctrl+C 强制终止当前的命令。
ctrl+L 清屏,相当于clear命令。
ctrl+U 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
ctrl+K 删除或剪切光标之后的内容。
ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容。
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
ctrl+D 退出当前终端。
ctrl+Z 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。
ctrl+S 暂停屏幕输出。
ctrl+Q 恢复屏幕输出。
10.3.3 输入输出重定向
1、标准输入输出
在Linux系统中,所有的内容(包括硬件)都是文件。
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
数字0代表标准输入;1代表标准输出;2代表标准错误输出。
2、输出重定向
在Linux中执行某一命令的输出结果,本应该输出到屏幕(显示器), 输出重定向指的就是把这个输出结果,重定向输出到其他指定的文件或设备中。
1)标准输出重定向
前提条件:命令有输出,且命令输出的结果是正确输出。
基本的命令格式 作用
命令 > 文件 以覆盖的方式,将命令的正确输出,重定向输出到指定的文件或设备中。
命令 >> 文件 以追加的方式,将命令的正确输出,重定向输出到指定的文件或设备中。
如果该文件之前不存在,就会自动创建。
示例:
[root@localhost ~]# date > a
#date命令的标准输出将不会输出到屏幕,而是重定向写入到a文件中,并覆盖该文件中的原有内容。
[root@localhost ~]# date >> a
#date命令的标准输出将不会输出到屏幕,而是重定向追加到a文件中,不会覆盖该文件中的原有内容。
说明:覆盖符号(>)或追加符号(»)前后的空格,都可以省略,但习惯加上空格。
2)标准错误输出重定向
前提条件:命令有输出,且命令输出的结果是错误输出。
基本的命令格式 作用
错误命令 2> 文件 以覆盖的方式,将命令的错误输出,重定向输出到指定的文件或设备中。
错误命令 2>> 文件 以追加的方式,将命令的错误输出,重定向输出到指定的文件或设备中。
如果该文件之前不存在,就会自动创建。
注意:数字2后面不能有空格,后面必须紧跟大于号。
示例:
[root@localhost ~]# lst 2> a.txt
#将错误命令lst的输出,以覆盖的方式,输出到该文件中。
3)正确输出和错误输出同时重定向
前提条件:命令有输出。
无论命令的输出是正确输出还是错误输出,都可以用这种重定向。
基本的命令格式 作用
命令 > 文件 2>&1 以覆盖的方式,将正确输出和错误输出都保存到同一个文件中。
命令 >> 文件 2>>&1 以追加的方式,将正确输出和错误输出都保存到同一个文件中。
命令 &> 文件 以覆盖的方式,将正确输出和错误输出都保存到同一个文件中。
命令 &>> 文件 以追加的方式,将正确输出和错误输出都保存到同一个文件中。
命令 >> 文件1 2>>文件2 如果命令是正确的,以追加的方式,把输出保存到文件1中;如果命令是错误的,以追加的方式,把输出保存到文件2中。
命令 &> /dev/null 直接将输出丢弃到垃圾箱(相当于不保存任何输出结果)。
示例:
[root@localhost ~]# date &> /dev/null
#无论date命令正确与否,都将输出直接丢弃到垃圾箱,即没有任何输出。
3、输入重定向
输入重定向用的很少,了解即可。
输入重定向一般有两种格式:
命令 < 文件
把文件作为命令相关参数的输入。
命令 << 标识符 **输入的内容 标识符
第一个标识符为起始标识符,可以为任意字符串,后面应回车。
第二个标识符为结束标识符,应位于最后一行的行首。
两个标识符应相同,中间的内容才是要输入的内容。
[root@localhost ~]# wc [选项] [文件名]
选项:
-c 统计字符数
-w 统计单词数
-l 统计行数
10.3.4 多命令顺序执行与管道符
1、多命令顺序执行
多命令执行符 格式 作用
; 命令1 ;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2 逻辑与
当命令1正确执行,则命令2才会执行
当命令1执行不正确,则命令2不会执行
|| 命令1 || 命令2 逻辑或
当命令1 执行不正确,则命令2才会执行
当命令1正确执行,则命令2不会执行
例子:
[root@localhost ~]# ls ; date ; cd /user ; pwd
[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例子:
[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
[root@localhost ~]# ls anaconda-ks.cfg && echo yes
[root@localhost ~]# ls /root/test || echo no
[root@localhost ~]# 命令 && echo yes || echo no
2、管道符
命令格式:
[root@localhost ~]# 命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
颜色显示
例子:
[root@localhost ~]# ll -a /etc/ | more
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
[root@localhost ~]# grep [选项] "搜索内容" 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
10.3.5 通配符与其他特殊符号
1、通配符
通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。
[-] 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母。
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符。
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch abc
[root@localhost tmp]# touch abcd
[root@localhost tmp]# touch 012
[root@localhost tmp]# touch 0abc
[root@localhost tmp]# ls ?abc
[root@localhost tmp]# ls [0-9]*
[root@localhost tmp]# ls [^0-9]*
2、Bash中其他特殊符号
符号 作用
'' 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。
"" 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。
$() 和反引号作用一样,用来引用系统命令。
# 在Shell脚本中,#开头的行代表注释。
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
\ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用。
反引号与$()
[root@localhost ~]# abc=`date`
[root@localhost ~]# echo $abc
[root@localhost ~]# echo $(date)
[root@localhost ~]# echo `ls`
单引号与双引号
[root@localhost ~]# name=sc
[root@localhost ~]# echo $name
[root@localhost ~]# echo '$name'
[root@localhost ~]# echo "$name"
[root@localhost ~]# echo ‘$(date)'
[root@localhost ~]# echo “$(date)"
10.4 Bash的变量
10.4.1 用户自定义变量
1、什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。 每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
2、变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”
则是错误的。
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
变量用等号连接值,等号左右两侧不能有空格。
变量的值如果有空格,需要使用单引号或双引号包括。
在变量的值中,可以使用\
转义符。
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"
或用${变量名}
包含。
如果是把命令的结果作为变量值赋予变量,则需要使用 反引号 或 $()
包含命令。
环境变量名建议大写,便于区分。
3、变量分类
用户自定义变量
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4、本地变量
变量定义
[root@localhost ~]# name="shen chao"
变量叠加
[root@localhost ~]# aa=123
[root@localhost ~]# aa="$aa"456
[root@localhost ~]# aa=${aa}789
变量调用
[root@localhost ~]# echo $name
变量查看
[root@localhost ~]# set
变量删除
[root@localhost ~]# unset name
[root@localhost ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=80
DIRSTACK=()
EUID=500
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/home/vagrant/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/vagrant
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=500
IFS=$' \t\n'
LANG=en_GB.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=vagrant
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/vagrant
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/composer:/home/vagrant/bin
PIPESTATUS=([0]="127")
PPID=2446
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/vagrant
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.0.2.2 53773 22'
SSH_CONNECTION='10.0.2.2 53773 10.0.2.15 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=500
USER=vagrant
_=SET
colors=/etc/DIR_COLORS
10.4.2 环境变量
1、什么是环境变量
自定义变量只在当前的shell中生效,而环境变量会在当前的shell和这个shell的所有子shell中生效。
如果把环境变量写入配置文件,它就会在所有的shell中生效。
Linux系统中有一些内置的环境变量,用户可以修改系统环境变量的值,也可以自定义新的环境变量。
2、操作环境变量
定义环境变量:
格式:export 变量名=变量值
[root@localhost ~]# export age=18
#定义一个新的环境变量age,值为18
也可将一个已经存在的本地变量(自定义变量)定义为环境变量。
格式:export 变量名
查看环境变量:
[root@localhost ~]# env
#查看所有的环境变量
[vagrant@localhost ~]$ env
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.2.2 53773 22
SSH_TTY=/dev/pts/0
USER=vagrant
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/vagrant
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/composer:/home/vagrant/bin
PWD=/home/vagrant
LANG=en_GB.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/vagrant
LOGNAME=vagrant
SSH_CONNECTION=10.0.2.2 53773 10.0.2.15 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
上述命令看不到PS1
这个环境变量,它是环境变量中的一个子分支,一个特例,可以通过set
命令查看。
调用环境变量:
格式:$变量名
[root@localhost ~]# echo $age
删除环境变量:
格式:unset 变量名
子shell:
- bash在当前的shell(Linux默认是bash)中,生成一个子shell。
pstree
查看系统的进程树,可以识别当前是处于哪一层shell中。exit
命令可以退出一层shell。
[vagrant@localhost ~]$ pstree
init─┬─VBoxService───7*[{VBoxService}]
├─auditd───{auditd}
├─crond
├─dhclient
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─mysqld_safe───mysqld───21*[{mysqld}]
├─nginx───nginx
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───sshd───bash───pstree
└─udevd───2*[udevd]
deepin下执行pstree
:
systemd─┬─ModemManager─┬─{gdbus}
│ └─{gmain}
├─NetworkManager─┬─dhclient
│ ├─{gdbus}
│ └─{gmain}
├─WeChatWeb.exe───11*[{WeChatWeb.exe}]
├─accounts-daemon─┬─{gdbus}
│ └─{gmain}
├─acpid
├─bamfdaemon-dbus───bamfdaemon─┬─{gdbus}
│ └─{gmain}
├─bluetoothd
├─containerd───14*[{containerd}]
├─cron
├─cupsd
├─4*[dbus-daemon]
├─2*[dbus-launch]
├─dconf-service─┬─{gdbus}
│ └─{gmain}
├─dde-control-cen─┬─{QDBusConnection}
│ ├─3*[{QThread}]
│ ├─{QXcbEventReader}
│ ├─{Qt bearer threa}
│ ├─{dconf worker}
│ ├─{disk_cache:0}
│ ├─{gdbus}
│ └─{gmain}
├─dde-file-manage─┬─{QDBusConnection}
│ └─{gmain}
├─dde-launcher─┬─{QDBusConnection}
│ ├─{QXcbEventReader}
│ ├─{dconf worker}
│ ├─{disk_cache:0}
│ ├─{gdbus}
│ └─{gmain}
├─dde-lock─┬─3*[onboard─┬─{dconf worker}]
│ │ ├─{gdbus}]
│ │ └─{gmain}]
│ ├─{Dtk::Widget::DK}
│ ├─{KeyboardMonitor}
│ ├─{QDBusConnection}
│ ├─{QXcbEventReader}
│ ├─{dconf worker}
│ ├─{disk_cache:0}
│ ├─{gdbus}
│ └─{gmain}
├─dde-osd─┬─{QDBusConnection}
│ ├─{QXcbEventReader}
│ ├─{Qt bearer threa}
│ ├─{dconf worker}
│ ├─{disk_cache:0}
│ ├─{gdbus}
│ ├─{gmain}
│ └─{threaded-ml}
├─dde-system-daem───15*[{dde-system-daem}]
├─deepin-anything───deepin-anything───{QDBusConnection}
├─deepin-menu─┬─{QDBusConnection}
│ ├─{QXcbEventReader}
│ ├─{dconf worker}
│ ├─{disk_cache:0}
│ ├─{gdbus}
│ └─{gmain}
├─deepin-sync-dae───11*[{deepin-sync-dae}]
├─deepin-sync-hel───5*[{deepin-sync-hel}]
├─deepin-wine───WeChat.exe───47*[{WeChat.exe}]
├─deepin-wm-dbus─┬─{QDBusConnection}
│ ├─{QXcbEventReader}
│ ├─{dconf worker}
│ ├─{gdbus}
│ └─{gmain}
├─dman-search───{QDBusConnection}
├─dockerd───13*[{dockerd}]
├─explorer.exe───3*[{explorer.exe}]
├─fcitx───{fcitx}
├─fcitx-dbus-watc
├─gconfd-2
├─gnome-keyring-d─┬─{gdbus}
│ ├─{gmain}
│ └─{timer}
├─gvfs-afc-volume─┬─{gdbus}
│ ├─{gmain}
│ └─{gvfs-afc-volume}
├─gvfs-goa-volume─┬─{gdbus}
│ └─{gmain}
├─gvfs-gphoto2-vo─┬─{gdbus}
│ └─{gmain}
├─gvfs-mtp-volume─┬─{gdbus}
│ └─{gmain}
├─gvfs-udisks2-vo─┬─{gdbus}
│ └─{gmain}
├─gvfsd─┬─{gdbus}
│ └─{gmain}
├─gvfsd-dnssd─┬─{gdbus}
│ └─{gmain}
├─gvfsd-fuse─┬─{gdbus}
│ ├─{gmain}
│ ├─{gvfs-fuse-sub}
│ └─2*[{gvfsd-fuse}]
├─gvfsd-http─┬─{gdbus}
│ └─{gmain}
├─gvfsd-metadata─┬─{gdbus}
│ └─{gmain}
├─gvfsd-network─┬─{dconf worker}
│ ├─{gdbus}
│ └─{gmain}
├─gvfsd-smb-brows─┬─{dconf worker}
│ ├─{gdbus}
│ └─{gmain}
├─gvfsd-trash─┬─{gdbus}
│ └─{gmain}
├─kglobalaccel5─┬─{QDBusConnection}
│ └─{QXcbEventReader}
├─lastore-daemon───14*[{lastore-daemon}]
├─lightdm─┬─Xorg─┬─{InputThread}
│ │ └─2*[{disk_cache:0}]
│ ├─lightdm─┬─startdde─┬─applet.py───{gmain}
│ │ │ ├─chrome─┬─2*[cat]
│ │ │ │ ├─chrome─┬─chrome─┬─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ │ │ ├─{Compositor}
│ │ │ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ │ │ ├─{MemoryInfra}
│ │ │ │ │ │ │ ├─2*[{ThreadPoolForeg}]
│ │ │ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ │ │ └─{ThreadPoolSingl}
│ │ │ │ │ │ ├─13*[chrome─┬─{Chrome_ChildIOT}]
│ │ │ │ │ │ │ ├─3*[{CompositorTileW+
│ │ │ │ │ │ │ ├─{Compositor}]
│ │ │ │ │ │ │ ├─{GpuMemoryThread}]
│ │ │ │ │ │ │ ├─{MemoryInfra}]
│ │ │ │ │ │ │ ├─{ThreadPoolForeg}]
│ │ │ │ │ │ │ └─{ThreadPoolServi}]
│ │ │ │ │ │ ├─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ │ │ ├─{Compositor}
│ │ │ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ │ │ ├─{Media}
│ │ │ │ │ │ │ ├─{MemoryInfra}
│ │ │ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ │ │ └─2*[{ThreadPoolSingl}]
│ │ │ │ │ │ ├─2*[chrome─┬─{Chrome_ChildIOT}]
│ │ │ │ │ │ │ ├─3*[{CompositorTileW}+
│ │ │ │ │ │ │ ├─{Compositor}]
│ │ │ │ │ │ │ ├─{GpuMemoryThread}]
│ │ │ │ │ │ │ ├─{ThreadPoolForeg}]
│ │ │ │ │ │ │ └─{ThreadPoolServi}]
│ │ │ │ │ │ └─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ │ ├─{Compositor}
│ │ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ │ ├─{MemoryInfra}
│ │ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ │ └─{ThreadPoolSingl}
│ │ │ │ │ └─nacl_helper
│ │ │ │ ├─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─{GpuWatchdog}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ ├─{VizCompositorTh}
│ │ │ │ │ └─{disk_cache:0}
│ │ │ │ ├─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─2*[{ThreadPoolForeg}]
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ ├─{gdbus}
│ │ │ │ │ ├─{gmain}
│ │ │ │ │ └─{inotify_reader}
│ │ │ │ ├─{BatteryStatusNo}
│ │ │ │ ├─{Bluez D-Bus thr}
│ │ │ │ ├─{BrowserWatchdog}
│ │ │ │ ├─{CacheThread_Blo}
│ │ │ │ ├─{Chrome_DevTools}
│ │ │ │ ├─{Chrome_HistoryT}
│ │ │ │ ├─{Chrome_IOThread}
│ │ │ │ ├─{CompositorTileW}
│ │ │ │ ├─{CrShutdownDetec}
│ │ │ │ ├─3*[{ThreadPoolForeg}]
│ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ ├─2*[{ThreadPoolSingl}]
│ │ │ │ ├─{VideoCaptureThr}
│ │ │ │ ├─{chrome}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{gpu-process_cra}
│ │ │ │ ├─{inotify_reader}
│ │ │ │ ├─{renderer_crash_}
│ │ │ │ ├─{sandbox_ipc_thr}
│ │ │ │ └─{utility_crash_u}
│ │ │ ├─dbeaver───java─┬─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─70*[{java}]
│ │ │ ├─dde-desktop─┬─{QDBusConnection}
│ │ │ │ ├─2*[{QThread}]
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{dde_file_manage}
│ │ │ │ ├─{disk_cache:0}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─dde-dock─┬─{QDBusConnection}
│ │ │ │ ├─{QThread}
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{Qt bearer threa}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{disk_cache:0}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─dde-file-manage─┬─{QDBusConnection}
│ │ │ │ ├─{QThread}
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{dde_file_manage}
│ │ │ │ ├─{disk_cache:0}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─dde-polkit-agen─┬─{QDBusConnection}
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─dde-session-dae─┬─{dconf worker}
│ │ │ │ ├─21*[{dde-session-dae}]
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─{threaded-ml}
│ │ │ ├─deepin-cloud-pr─┬─{QDBusConnection}
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{disk_cache:0}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─deepin-editor─┬─{QDBusConnection}
│ │ │ │ ├─2*[{QThread}]
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{disk_cache:0}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─deepin-terminal─┬─bash───pstree
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─deepin-terminal─┬─bash─┬─du
│ │ │ │ │ └─netstat
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─dingtalk─┬─dingtalk───dingtalk
│ │ │ │ ├─dingtalk─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─2*[{TaskSchedulerFo}]
│ │ │ │ │ ├─{TaskSchedulerSe}
│ │ │ │ │ ├─{VizCompositorTh}
│ │ │ │ │ ├─{Watchdog}
│ │ │ │ │ └─{disk_cache:0}
│ │ │ │ ├─dingtalk─┬─{AudioOutputDevi}
│ │ │ │ │ ├─{Chrome_ChildIOT}
│ │ │ │ │ ├─2*[{Chrome_libJingl}]
│ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ ├─{Compositor}
│ │ │ │ │ ├─{Font_Proxy_Thre}
│ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ ├─{Media}
│ │ │ │ │ ├─{SendControllerT}
│ │ │ │ │ ├─3*[{TaskSchedulerFo}]
│ │ │ │ │ ├─{TaskSchedulerSe}
│ │ │ │ │ └─{dingtalk}
│ │ │ │ ├─{AudioThread}
│ │ │ │ ├─{Bluez D-Bus thr}
│ │ │ │ ├─{CacheThread_Blo}
│ │ │ │ ├─{Chrome_IOThread}
│ │ │ │ ├─{CompositorTileW}
│ │ │ │ ├─{CrShutdownDetec}
│ │ │ │ ├─{MidiService_Tas}
│ │ │ │ ├─{NetworkChangeNo}
│ │ │ │ ├─3*[{TaskSchedulerFo}]
│ │ │ │ ├─{TaskSchedulerSe}
│ │ │ │ ├─3*[{TaskSchedulerSi}]
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─11*[{dingtalk}]
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{inotify_reader}
│ │ │ │ ├─{sandbox_ipc_thr}
│ │ │ │ └─{threaded-ml}
│ │ │ ├─firefox-bin─┬─RDD Process─┬─{Chrome_~dThread}
│ │ │ │ │ ├─{ProfilerChild}
│ │ │ │ │ └─{RemVidParent}
│ │ │ │ ├─4*[Web Content─┬─{AudioIPC0}]
│ │ │ │ │ ├─{Chrome_~dThread}]
│ │ │ │ │ ├─{DOM File}]
│ │ │ │ │ ├─{HTML5 Parser}]
│ │ │ │ │ ├─{ImageBr~geChild}]
│ │ │ │ │ ├─{ImageIO}]
│ │ │ │ │ ├─{ImgDecoder #1}]
│ │ │ │ │ ├─{ImgDecoder #2}]
│ │ │ │ │ ├─4*[{JS Helper}]]
│ │ │ │ │ ├─{JS Watchdog}]
│ │ │ │ │ ├─{PaintThread}]
│ │ │ │ │ ├─{ProcessHangMon}]
│ │ │ │ │ ├─{ProfilerChild}]
│ │ │ │ │ ├─{RemVidChild}]
│ │ │ │ │ ├─{Socket Thread}]
│ │ │ │ │ ├─{StyleThread#0}]
│ │ │ │ │ ├─{StyleThread#1}]
│ │ │ │ │ ├─{StyleThread#2}]
│ │ │ │ │ ├─{Timer}]
│ │ │ │ │ └─{Worker Launcher}]
│ │ │ │ ├─Web Content─┬─{AudioIPC0}
│ │ │ │ │ ├─{Chrome_~dThread}
│ │ │ │ │ ├─{DOM File}
│ │ │ │ │ ├─{HTML5 Parser}
│ │ │ │ │ ├─{ImageBr~geChild}
│ │ │ │ │ ├─{ImageIO}
│ │ │ │ │ ├─{ImgDecoder #1}
│ │ │ │ │ ├─{ImgDecoder #2}
│ │ │ │ │ ├─{ImgDecoder #3}
│ │ │ │ │ ├─4*[{JS Helper}]
│ │ │ │ │ ├─{JS Watchdog}
│ │ │ │ │ ├─{PaintThread}
│ │ │ │ │ ├─{ProcessHangMon}
│ │ │ │ │ ├─{ProfilerChild}
│ │ │ │ │ ├─{RemVidChild}
│ │ │ │ │ ├─{Socket Thread}
│ │ │ │ │ ├─{StyleThread#0}
│ │ │ │ │ ├─{StyleThread#1}
│ │ │ │ │ ├─{StyleThread#2}
│ │ │ │ │ ├─{Timer}
│ │ │ │ │ └─{Worker Launcher}
│ │ │ │ ├─Web Content─┬─{AudioIPC0}
│ │ │ │ │ ├─{Chrome_~dThread}
│ │ │ │ │ ├─{DOM File}
│ │ │ │ │ ├─{ImageBr~geChild}
│ │ │ │ │ ├─{ImageIO}
│ │ │ │ │ ├─{ImgDecoder #1}
│ │ │ │ │ ├─4*[{JS Helper}]
│ │ │ │ │ ├─{JS Watchdog}
│ │ │ │ │ ├─{PaintThread}
│ │ │ │ │ ├─{ProcessHangMon}
│ │ │ │ │ ├─{ProfilerChild}
│ │ │ │ │ ├─{RemVidChild}
│ │ │ │ │ ├─{Socket Thread}
│ │ │ │ │ ├─{Timer}
│ │ │ │ │ └─{Worker Launcher}
│ │ │ │ ├─WebExtensions─┬─{AudioIPC0}
│ │ │ │ │ ├─{Chrome_~dThread}
│ │ │ │ │ ├─{DOM File}
│ │ │ │ │ ├─{FileBlockCache}
│ │ │ │ │ ├─{HTML5 Parser}
│ │ │ │ │ ├─{ImageBr~geChild}
│ │ │ │ │ ├─{ImageIO}
│ │ │ │ │ ├─{ImgDecoder #1}
│ │ │ │ │ ├─{ImgDecoder #2}
│ │ │ │ │ ├─4*[{JS Helper}]
│ │ │ │ │ ├─{JS Watchdog}
│ │ │ │ │ ├─{MediaCache}
│ │ │ │ │ ├─{PaintThread}
│ │ │ │ │ ├─{ProcessHangMon}
│ │ │ │ │ ├─{ProfilerChild}
│ │ │ │ │ ├─{RemVidChild}
│ │ │ │ │ ├─{Socket Thread}
│ │ │ │ │ ├─{StyleThread#0}
│ │ │ │ │ ├─{StyleThread#1}
│ │ │ │ │ ├─{StyleThread#2}
│ │ │ │ │ ├─{Timer}
│ │ │ │ │ └─{Worker Launcher}
│ │ │ │ ├─{AudioIPC Callba}
│ │ │ │ ├─{AudioIPC Server}
│ │ │ │ ├─{Breakpad Server}
│ │ │ │ ├─{Cache I/O}
│ │ │ │ ├─{Cache2 I/O}
│ │ │ │ ├─{Classif~ Update}
│ │ │ │ ├─{Compositor}
│ │ │ │ ├─{Cookie}
│ │ │ │ ├─{DNS Res~ver #79}
│ │ │ │ ├─{DNS Res~ver #80}
│ │ │ │ ├─{DNS Res~ver #81}
│ │ │ │ ├─{DOM File}
│ │ │ │ ├─4*[{DOM Worker}]
│ │ │ │ ├─{DataStorage}
│ │ │ │ ├─{FS Broker 14045}
│ │ │ │ ├─{FS Broker 16802}
│ │ │ │ ├─{FS Broker 16861}
│ │ │ │ ├─{FS Broker 16899}
│ │ │ │ ├─{FS Broker 17048}
│ │ │ │ ├─{FS Broker 18356}
│ │ │ │ ├─{FS Broker 18405}
│ │ │ │ ├─{FS Broker 26109}
│ │ │ │ ├─{GMPThread}
│ │ │ │ ├─{Gecko_IOThread}
│ │ │ │ ├─{HTML5 Parser}
│ │ │ │ ├─{IPDL Background}
│ │ │ │ ├─{IdentityCrypto}
│ │ │ │ ├─{ImageBr~geChild}
│ │ │ │ ├─{ImageIO}
│ │ │ │ ├─{ImgDecoder #1}
│ │ │ │ ├─{ImgDecoder #2}
│ │ │ │ ├─4*[{JS Helper}]
│ │ │ │ ├─{JS Watchdog}
│ │ │ │ ├─{Netlink Monitor}
│ │ │ │ ├─{ProcessHangMon}
│ │ │ │ ├─{QuotaManager IO}
│ │ │ │ ├─{Socket Thread}
│ │ │ │ ├─{Softwar~cThread}
│ │ │ │ ├─{StyleThread#0}
│ │ │ │ ├─{StyleThread#1}
│ │ │ │ ├─{StyleThread#2}
│ │ │ │ ├─{Timer}
│ │ │ │ ├─{URL Classifier}
│ │ │ │ ├─{Worker Launcher}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{firefox-bin}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{localStorage DB}
│ │ │ │ ├─{mozStorage #1}
│ │ │ │ ├─{mozStorage #2}
│ │ │ │ ├─{mozStorage #3}
│ │ │ │ ├─{mozStorage #4}
│ │ │ │ ├─{mozStorage #5}
│ │ │ │ ├─{mozStorage #6}
│ │ │ │ ├─{mozStorage #7}
│ │ │ │ ├─{mozStorage #8}
│ │ │ │ ├─{mozStorage #9}
│ │ │ │ └─{threaded-ml}
│ │ │ ├─kwin_no_scale───kwin_x11─┬─{QDBusConnection}
│ │ │ │ ├─{QQmlThread}
│ │ │ │ ├─{QXcbEventReader}
│ │ │ │ └─{kwin_x11}
│ │ │ ├─phpstorm───java─┬─fsnotifier64
│ │ │ │ ├─jcef_helper───jcef_helper─┬─{Chrome_Child+
│ │ │ │ │ ├─{GpuWatchdog}
│ │ │ │ │ ├─{ThreadPoolFo+
│ │ │ │ │ ├─{ThreadPoolSe+
│ │ │ │ │ ├─{VizComposito+
│ │ │ │ │ └─2*[{disk_cach+
│ │ │ │ ├─jcef_helper───15*[jcef_helper─┬─{Chrome_C+
│ │ │ │ │ ├─3*[{Compo+
│ │ │ │ │ ├─{Composit+
│ │ │ │ │ ├─{GpuMemor+
│ │ │ │ │ ├─{ThreadPo+
│ │ │ │ │ ├─{ThreadPo+
│ │ │ │ │ └─{ThreadPo+
│ │ │ │ ├─jcef_helper─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─{inotify_reader}
│ │ │ │ ├─{AWT-EventQueue-}
│ │ │ │ ├─{AWT-Shutdown}
│ │ │ │ ├─{AWT-XAWT}
│ │ │ │ ├─2*[{ApplicationImpl}]
│ │ │ │ ├─2*[{BaseDataReader:}]
│ │ │ │ ├─{C1 CompilerThre}
│ │ │ │ ├─{C2 CompilerThre}
│ │ │ │ ├─{CMS Main Thread}
│ │ │ │ ├─{Chrome_IOThread}
│ │ │ │ ├─{Common-Cleaner}
│ │ │ │ ├─{CompositorTileW}
│ │ │ │ ├─{CrBrowserMain}
│ │ │ │ ├─4*[{DefaultDispatch}]
│ │ │ │ ├─{DirectBufferWra}
│ │ │ │ ├─{Finalizer}
│ │ │ │ ├─{GC Thread#0}
│ │ │ │ ├─{GC Thread#1}
│ │ │ │ ├─{GC Thread#2}
│ │ │ │ ├─{GC Thread#3}
│ │ │ │ ├─{GlobalMenuLinux}
│ │ │ │ ├─{Java2D Disposer}
│ │ │ │ ├─10*[{JobScheduler FJ}]
│ │ │ │ ├─{MemoryInfra}
│ │ │ │ ├─3*[{Netty Builtin S}]
│ │ │ │ ├─{Periodic tasks }
│ │ │ │ ├─{Reference Handl}
│ │ │ │ ├─{Service Thread}
│ │ │ │ ├─{Signal Dispatch}
│ │ │ │ ├─{Sweeper thread}
│ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ ├─2*[{ThreadPoolSingl}]
│ │ │ │ ├─{Timer-0}
│ │ │ │ ├─{TimerQueue}
│ │ │ │ ├─{VM Periodic Tas}
│ │ │ │ ├─{VM Thread}
│ │ │ │ ├─{VideoCaptureThr}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{fsnotifier64}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{inotify_reader}
│ │ │ │ ├─{java}
│ │ │ │ ├─{process reaper}
│ │ │ │ └─{sandbox_ipc_thr}
│ │ │ ├─postman───sh───_Postman─┬─_Postman
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─{GpuWatchdog}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ ├─{VizCompositorTh}
│ │ │ │ │ └─{disk_cache:0}
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─{inotify_reader}
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ ├─{Compositor}
│ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─5*[{_Postman}]
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ ├─{Compositor}
│ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ ├─2*[{ThreadPoolForeg}]
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─5*[{_Postman}]
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ ├─{Compositor}
│ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ ├─3*[{ThreadPoolForeg}]
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─5*[{_Postman}]
│ │ │ │ ├─_Postman─┬─{Chrome_ChildIOT}
│ │ │ │ │ ├─3*[{CompositorTileW}]
│ │ │ │ │ ├─{Compositor}
│ │ │ │ │ ├─{DedicatedWorker}
│ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ ├─{ThreadPoolForeg}
│ │ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ │ └─5*[{_Postman}]
│ │ │ │ ├─{Bluez D-Bus thr}
│ │ │ │ ├─{CacheThread_Blo}
│ │ │ │ ├─{Chrome_IOThread}
│ │ │ │ ├─{CompositorTileW}
│ │ │ │ ├─{CrShutdownDetec}
│ │ │ │ ├─{LevelDBEnv.IDB}
│ │ │ │ ├─2*[{ThreadPoolForeg}]
│ │ │ │ ├─{ThreadPoolServi}
│ │ │ │ ├─2*[{ThreadPoolSingl}]
│ │ │ │ ├─{VideoCaptureThr}
│ │ │ │ ├─10*[{_Postman}]
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{inotify_reader}
│ │ │ │ └─{sandbox_ipc_thr}
│ │ │ ├─wps───wps─┬─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─4*[{wps}]
│ │ │ ├─wpspdf───wpspdf─┬─wpspdf
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─10*[{wpspdf}]
│ │ │ ├─{dconf worker}
│ │ │ ├─{gdbus}
│ │ │ ├─{gmain}
│ │ │ └─32*[{startdde}]
│ │ ├─{gdbus}
│ │ └─{gmain}
│ ├─{gdbus}
│ └─{gmain}
├─lvmetad
├─lwsmd─┬─3*[lwsmd───21*[{lwsmd}]]
│ ├─2*[lwsmd───22*[{lwsmd}]]
│ ├─lwsmd───36*[{lwsmd}]
│ └─21*[{lwsmd}]
├─miracle-dispd
├─miracle-wifid
├─mysqld───27*[{mysqld}]
├─nginx───4*[nginx]
├─nmbd
├─packagekitd─┬─{gdbus}
│ └─{gmain}
├─php-fpm7.1───3*[php-fpm7.1]
├─plugplay.exe───2*[{plugplay.exe}]
├─polkitd─┬─{gdbus}
│ └─{gmain}
├─pulseaudio─┬─{alsa-sink-ALC32}
│ ├─{alsa-sink-HDMI }
│ └─{alsa-source-ALC}
├─services.exe───6*[{services.exe}]
├─smbd─┬─cleanupd
│ ├─lpqd
│ ├─2*[smbd]
│ └─smbd-notifyd
├─sogou-qimpanel─┬─3*[{QInotifyFileSys}]
│ ├─2*[{QThread}]
│ └─5*[{sogou-qimpanel}]
├─sogou-qimpanel-
├─starter───charon───16*[{charon}]
├─syndaemon
├─systemd───(sd-pam)
├─systemd-journal
├─systemd-logind
├─systemd-timesyn───{sd-resolve}
├─systemd-udevd
├─udisksd─┬─{cleanup}
│ ├─{gdbus}
│ ├─{gmain}
│ └─{probing-thread}
├─upowerd─┬─{gdbus}
│ └─{gmain}
├─2*[winedevice.exe───3*[{winedevice.exe}]]
├─wineserver.real
└─wpa_supplicant
3、系统中常见的环境变量
系统中的环境变量有多个,这里只讲解常见的两个:PATH
和PS1
。
1)PATH
PATH的值是一系列路径字符串,是系统查找命令的路径,各个路径之间用冒号分割。
Linux中绝大多数的系统命令都是二进制的可执行文件。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
修改PATH的值:
[root@localhost ~]# PATH="$PATH":/root/sh
将字符串 :/root/sh
拼接到环境变量PATH
的值的后面。
注意:这种更改环境变量PATH
的值的方式只会临时生效,一旦重启,就会恢复原来的值。要想永久生效,需修改环境变量配置文件。
2)PS1
PS1的作用是定义系统提示符的格式,默认值是[\u@\h \W]$
。
注意:最后有一个空格。
[root@localhost ~]# echo $PS1
对于PS1的值,可选的特殊字符有:
\d 显示当前日期。格式为“星期 月 日”。
\h 显示简写主机名。默认主机名为“localhost”。
\t 显示24小时制时间。格式为“HH:MM:SS”。
\T 显示12小时制时间。格式为“HH:MM:SS”。
\A 显示24小时制时间(不包含秒)。格式为“HH:MM”。
\u 显示当前用户名。
\w 显示用户当前所在目录的完整名称。
\W 显示用户当前所在目录的最后一个文件夹。
# 显示这是第几条命令。
$ 起始符。root用户,显示#;普通用户,显示$。
修改PS1的值:
[root@localhost ~]# PS1='[\u@\h \A \w]\$ '
修改环境变量PS1的值,进而修改系统的提示符。
只会临时生效。
10.4.3 位置参数变量
位置参数变量其实属于预定义变量的一种。
位置参数变量主要有以下这些:
位置参数变量 说明
$n n为数字。$0代表命令本身,$1到$9代表第1到第9个参数(参数的值是执行该命令时,从1开始依次输入的),十以上的参数要用大括号包含,如${10}。
$* 这个变量代表命令行中所有的参数(不包括$0),它把所有的参数当做一个整体对待。对其进行for循环遍历时,只会循环一次。
$@ 这个变量也代表命令行中所有的参数(不包括$0),它把所有的参数当做独立的个体区别对待。对其进行for循环遍历时,可循环多次。
$# 这个变量代表命令行中所有参数的个数(不包括$0)。
位置参数变量的名称和作用都是固定的,但我们可以给其传入不同的值。
位置参数变量的作用是接收用户执行命令时传入的参数以及命令本身。
位置参数变量主要用在shell脚本文件中,那么它的作用就是把命令和命令的参数传递到当前执行的脚本中。
示例1:
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
示例2:
#!bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
示例3:$* 和 $@ 的区别
#!/bin/bash
for i in "$*"
# $*中的所有参数看成是一个整体,所以这for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
# $@中的每个参数都看成是独立的,所以"$@"中有几个参数,就会循环几次
do
echo "The parameters is: $y"
x=$(( $x +1 ))
done
编写一个shell脚本文件canshu.sh,并执行它来说明。
vi canshu.sh
canshu.sh的内容如下:
#!/bin/bash
for i in "$*"
do
echo $i
done
for y in "$@"
do
echo $y
done
echo $#
给该shell脚本赋予执行权限。
chmod 755 canshu.sh
赋予执行权限。
执行该脚本,并传递1234
[root@localhost 12:41 ~/sh]# cat canshu.sh 1 2 3 4
#输出结果:
1 2 3 4
1
2
3
4
10.4.4 预定义变量
1、预定义变量
预定义变量 说明
$? 用于判断上一条命令的执行状态。如果上一条命令执行正确,则这个变量的值是0;如果上一条命令执行错误,则这个变量的值是除0之外的其他数(具体是哪个数,由命令的撰写者决定)。
$$ 当前进程的进程号(PID)。
$! 在后台运行的最后一个进程的进程号(PID)。
示例:
命令正确时的情况:
[root@localhost ~]# ls
#查看有什么文件目录
#用于测试这条命令能否正确执行
[root@localhost ~]# echo $?
0
命令错误时的情况:
[root@localhost ~]# lstt
-bash: lstt: command not found
[root@localhost ~]# echo $?
127
文件没有找到时的报错信息:
[root@localhost ~]# echo $?
2
#返回一个2提示文件没有找到
关于进程号变量格式:
[root@localhost ~]# echo $$
[root@localhost ~]# echo $!
每个计算机程序只要在运行,至少会产生一个进程。
没有后台运行的进程时,$!
的值会为空。
这里,写一个脚本文件示例,内容如下:
#!/bin/bash
#Author: shenchao
echo "The current process is $$"
#输出当前进程的PID
#这个PID其实就是这个脚本执行时产生的进程的PID
find /root/sh -name hello.sh&
#使用find命令查找hello.sh文件
#符号&表示把这条命令放入后台执行
echo "The last of daemon processes is $!"
赋予执行权限:
chmod 755 variable.sh
执行该脚本:
[root@localhost sh]# ./variable.sh
The current process is 8889
The last of daemon processes is 8890
[root@localhost sh]# /root/sh/hello.sh
2、接收键盘输入
[root@localhost~]# read [选项] [变量名]
作用:接收键盘输入的字符串作为变量的值。
选项:
-p “提示信息” :在等待键盘输入时,输出提示信息,方便用户输入。
-t 秒数:指定等待时间,防止read命令一直等待用户输入。
-n 字符数:指定输入的字符数,只要用户输入指定的字符数,该read命令立即执行完毕。
-s:隐藏输入的数据(屏幕上看不到任何输入信息)。
示例:
[root@localhost sh]# read -p "please input a number:" ab
please input a number:6
[root@localhost sh]# echo $ab
# 6
read
命令也可用于shell脚本文件中,接收用户的输入来作为变量的值。
编写一个脚本 read.sh,内容如下:
#!/bin/bash
#Author: shenchao
read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30秒,把用户的输入保存到变量name中
echo "Your name is $name"
echo -e "\r"
# 回车
read -s -t 30 -p "Please input your age: " age
#年龄是隐私,所以用“-s”选项隐藏输入
echo -e "\r"
# 回车
echo "Age is $age"
echo -e "\r"
# 回车
read -n 1 -t 30 -p "Please select your gender [M/F]: " gender
#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\r"
# 回车
echo "Gender is $gender"
赋予执行权限,然后执行该脚本。
chmod 755 read.sh
./read.sh
10.5 Bash的运算符
10.5.1 数值运算与运算符
1、declare声明变量类型
[root@localhost ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
2、数值运算
方法1:declare声明变量类型
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
[root@localhost ~]# echo $dd
33
方法3:“$((运算式))
”或“$[运算式]
”
$()
的作用是优先执行括号内的命令,并将命令的执行结果保存在内存中(而不是直接输出)。
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# echo $ff
33
[root@localhost ~]# gg=$[ $aa+$bb ]
说明:+
号左右两侧的空格也可省略。
总结:推荐使用第三种方法,因为它更加方便和灵活。
3、运算符
Linux中的运算符主要有单目运算符和双目运算符,运算符也有优先级的高低之分。
优先级 运算符 类型 说明
13 +、- 单目 单目正、单目负。它们是单目运算符的正、负,而不是加、减。
12 !、~ 单目 逻辑非、按位取反或补码。
11 *、/、% 双目 乘、除、取模。
10 +、- 双目 加、减。
9 <<、>> 双目 按位左移、按位右移。
8 <、<=、>、>= 双目 小于、小于等于、大于、大于等于。
7 ==、!= 双目 等于、不等于。
6 & 双目 按位与。
5 ^ 双目 按位异或。
4 | 双目 按位或。
3 && 双目 逻辑与。
2 || 双目 逻辑或。
1 =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= 双目 赋值、运算且赋值。
说明:对于该表,数值越大,优先级越高。故赋值运算符的优先级最低。
注意: 小括号内的表达式的优先级最高,会优先运算。因此,可以用小括号改变运算符的优先级。
优先级越高,会先进行运算;相同优先级的运算符,按照先后顺序顺序运算。
[root@localhost ~]# aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]# bb=$(( 14%3 ))
#14不能被3整除,余数是2
[root@localhost ~]# cc=$(( 1 && 0 ))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
说明:
对于逻辑与(&&)运算,只有当两侧的值都为非0时,整个表达式的值才为1。
对于逻辑或(||)运算,只有当两侧的值都为0时,整个表达式的值才为0。
示例:
[root@localhost ~]# echo $(( (3+5)*6 ))
48
[root@localhost ~]# echo $(( 14%3 ))
2
[root@localhost ~]# echo $[ 1&&1 ]
1
[root@localhost ~]# echo $[ 1&&0 ]
0
[root@localhost ~]# echo $[ 0||0 ]
0
[root@localhost ~]# echo $[ ab || a2 ]
0
[root@localhost ~]# echo $[ 0||null ]
0
[root@localhost ~]# echo $[ 1||0 ]
1
[root@localhost ~]# echo $[ a||b ]
1
10.5.2 变量测试与内容替换
变量置换方式 变量y没有设置 变量y为空值 变量y设置值
x=${y-新值} x=新值 x为空 x=$y
x=${y:-新值} x=新值 x=新值 x=$y
x=${y+新值} x为空 x=新值 x=新值
x=${y:+新值} x为空 x为空 x=新值
x=${y=新值} x=新值 y=新值 x为空 y值不变 x=$y y值不变
x=${y:=新值} x=新值 y=新值 x=新值 y=新值 x=$y y值不变
x=${y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x=$y
x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y
例子1:测试 x=${y-新值}
[root@localhost ~]# unset y
#删除变量y
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
new
#因为变量y不存在,所以x=new
[root@localhost ~]# y=""
#给变量y赋值为空
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
[root@localhost ~]# y=old
#给变量y赋值
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
old
10.6 环境变量配置文件
10.6.1 环境变量配置文件简介
1、source命令
source命令可以重载配置文件,而不需要重启系统。
[root@localhost ~]# source 配置文件
或
[root@localhost ~]# . 配置文件
2、环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
10.6.2 环境变量配置文件作用
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
/etc/profile
的作用:
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量:
umask:
调用/etc/profile.d/*.sh文件
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
~/.bash_profile
的作用
调用了`~/.bashrc`文件。
在PATH变量后面加入了`“:$HOME/bin”`这个目录
~/.bashrc
的作用
定义默认别名
调用`/etc/bashrc`
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
#alias grep='grep --color=auto'
#alias fgrep='fgrep --color=auto'
#alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# Set LS_COLORS environment by Deepin
if [[ ("$TERM" = *256color || "$TERM" = screen* || "$TERM" = xterm* ) && -f /etc/lscolor-256color ]]; then
eval $(dircolors -b /etc/lscolor-256color)
else
eval $(dircolors)
fi
alias phpstorm='nohup sh /home/baiyang/worksoft/PhpStorm/bin/phpstorm.sh >/dev/null >/dev/null 2>&1 &'
/etc/bashrc
的作用
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
baiyang@baiyang-PC:~$ ls -lah /etc/profile.d/
总用量 20K
drwxr-xr-x 2 root root 4.0K 12月 17 05:06 .
drwxr-xr-x 135 root root 12K 4月 29 12:50 ..
-rw-r--r-- 1 root root 663 12月 17 05:06 bash_completion.sh
baiyang@baiyang-PC:~$ cat /etc/profile.d/bash_completion.sh
# Check for interactive bash and that we haven't already been sourced.
if [ -n "$BASH_VERSION" -a -n "$PS1" -a -z "$BASH_COMPLETION_COMPAT_DIR" ]; then
# Check for recent enough version of bash.
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ $bmajor -gt 4 ] || [ $bmajor -eq 4 -a $bminor -ge 1 ]; then
[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
. "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
# Source completion code.
. /usr/share/bash-completion/bash_completion
fi
fi
unset bash bmajor bminor
fi
10.6.3 其他配置文件和登录信息
1、注销时生效的环境变量配置文件
~/.bash_logout
baiyang@baiyang-PC:~$ cat .bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.
# when leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
2、其他配置文件
~/bash_history
3、Shell登录信息
本地终端欢迎信息: /etc/issue
转义符 作用
\d 显示当前系统日期
\s 显示操作系统名称
\l 显示登录的终端号,这个比较常用。
\m 显示硬件体系结构,如i386、i686等
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登录用户的序列号
baiyang@baiyang-PC:~$ cat /etc/issue
Deepin GNU/Linux 15.11 \n \l
远程终端欢迎信息: /etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
baiyang@baiyang-PC:~$ cat /etc/issue.net
Deepin GNU/Linux 2019
登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息
baiyang@baiyang-PC:~$ cat /etc/motd
Welcome to Deepin 15.10 GNU/Linux
* Homepage:https://www.deepin.org/
* Bugreport:https://feedback.deepin.org/feedback/
* Community:https://bbs.deepin.org/
参考资料
Linux学习日记 —— 10.4.2 Shell基础-Bash变量-环境变量 https://blog.csdn.net/dyw_666666/article/details/79427767