目录
16. 父shell 子shell ( ps -f --forest )
21. 全局环境变量 局部环境变量 用户定义变量( env, printenv, =" ", export, unset )
23. 启动文件 ( /etc/profile.d/*.sh, ~/.bashrc )
16. 父shell 子shell ( ps -f --forest )
每次在命令行输入bash,其实会创建一个新的shell进程
cjh@cjh-PC:~$ ps -f --forest
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 13:37 pts/0 00:00:00 bash
cjh 99498 98040 0 14:56 pts/0 00:00:00 \_ ps -f --forest
cjh@cjh-PC:~$ bash
cjh@cjh-PC:~$ bash
cjh@cjh-PC:~$ ps -f --forest
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 13:37 pts/0 00:00:00 bash
cjh 99499 98040 0 14:56 pts/0 00:00:00 \_ bash
cjh 99505 99499 0 14:56 pts/0 00:00:00 \_ bash
cjh 99513 99505 0 14:56 pts/0 00:00:00 \_ ps -f --forest
通过每个进程的PID和父PID可以看出端倪
可以通过exit不停退出当前进程(甚至是退出命令行终端)
cjh@cjh-PC:~$ ps -f --forest
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 13:37 pts/0 00:00:00 bash
cjh 99499 98040 0 14:56 pts/0 00:00:00 \_ bash
cjh 99505 99499 0 14:56 pts/0 00:00:00 \_ bash
cjh 99513 99505 0 14:56 pts/0 00:00:00 \_ ps -f --forest
cjh@cjh-PC:~$ exit
exit
cjh@cjh-PC:~$ exit
exit
cjh@cjh-PC:~$ ps -f --forest
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 13:37 pts/0 00:00:00 bash
cjh 99579 98040 0 15:05 pts/0 00:00:00 \_ ps -f --forest
17. 进程列表() & 协程 coproc
把命令组包含在括号里,可以形成 进程列表,生成了一个新的bash进程
cjh@cjh-PC:~$ (pwd;ls -l;date; sleep 5&)
/home/cjh
总用量 76
drwxrwxr-x 3 cjh cjh 4096 3月 16 14:41 2022job
drwxr-xr-x 3 cjh cjh 4096 1月 27 2021 读书笔记
drwxr-xr-x 2 cjh cjh 4096 11月 16 23:06 公共的
drwxr-xr-x 2 cjh cjh 4096 11月 18 20:07 模板
drwxr-xr-x 2 cjh cjh 4096 2月 26 20:58 视频
drwxr-xr-x 2 cjh cjh 4096 2月 26 15:48 图片
drwxr-xr-x 3 cjh cjh 4096 2月 26 21:05 文档
drwxr-xr-x 3 cjh cjh 4096 3月 16 22:44 下载
drwxr-xr-x 4 cjh cjh 4096 1月 21 2021 项目工程文件
drwxr-xr-x 2 cjh cjh 4096 11月 16 23:06 音乐
drwxr-xr-x 2 cjh cjh 4096 2月 26 11:47 桌面
drwxr-xr-x 4 cjh cjh 4096 3月 16 22:01 自学
drwxrwxr-x 12 cjh cjh 4096 3月 14 21:26 C_Program
drwxrwxr-x 11 cjh cjh 4096 2月 26 12:31 linux
drwxr-xr-x 5 cjh cjh 4096 2月 24 11:31 LinuxBoard
drwxr-xr-x 4 cjh cjh 4096 11月 18 21:27 pdf
drwxr-xr-x 4 cjh cjh 4096 2月 22 19:03 QtStudy
drwxrwxr-x 2 cjh cjh 4096 3月 15 19:18 Shell_Program
drwx------ 6 cjh cjh 4096 2月 27 13:08 snap
2022年 03月 17日 星期四 15:33:20 CST
cjh@cjh-PC:~$ ps -f --forest
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 13:37 pts/0 00:00:00 bash
cjh 99776 98040 0 15:33 pts/0 00:00:00 \_ ps -f --forest
cjh 99775 864 0 15:33 pts/0 00:00:00 sleep 5
协程可以同时做两件事。它默认在后台生成一个子shell,并在这个子shell中执行命令。
cjh@cjh-PC:~$ coproc sleep 10
[1] 101759
cjh@cjh-PC:~$ jobs
[1]+ 运行中 coproc COPROC sleep 10 &
18. 外部命令 & 内部命令 which type
外部命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。 外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。
ps就是一个外部命令。
cjh@cjh-PC:~$ ps -f
UID PID PPID C STIME TTY TIME CMD
cjh 98040 98032 0 3月17 pts/0 00:00:00 bash
cjh 101882 98040 0 10:55 pts/0 00:00:00 ps -f
内建命令不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。内建命令的执行速度要更快,效率也更高。
cd 和exit命令都内建于bash shell。
可以利用type命令来了解某个命令是否是内建的。(最好用type -a)
cjh@cjh-PC:~$ type cd
cd 是 shell 内建
cjh@cjh-PC:~$ type exit
exit 是 shell 内建
cjh@cjh-PC:~$ type ps
ps 已被录入哈希表 (/usr/bin/ps)
cjh@cjh-PC:~$ type tree
tree 已被录入哈希表 (/usr/bin/tree)
cjh@cjh-PC:~$ type pwd
pwd 是 shell 内建
cjh@cjh-PC:~$ type -a pwd
pwd 是 shell 内建
pwd 是 /usr/bin/pwd
pwd 是 /bin/pwd
cjh@cjh-PC:~$ type -a echo
echo 是 shell 内建
echo 是 /usr/bin/echo
echo 是 /bin/echo
which 命令可以显示 某个命令的源程序路径(内建命令不显示)
cjh@cjh-PC:~$ which cd
cjh@cjh-PC:~$ which ps
/usr/bin/ps
cjh@cjh-PC:~$ which echo
/usr/bin/echo
19. history (.bash_history)
history 命令会输出最近用过的命令列表。与.bash_history内容大致一样。
用 '!' 可以专门调取某条历史指令
1006 type -a pwd
1007 type -a echo
1008 which cd
1009 which ps
1010 which echo
1011 ls -a
1012 head -30 .bash_history
1013 tail -30 .bash_history
1014 ls
1015 history
cjh@cjh-PC:~$ !1011
ls -a
. 模板 项目工程文件 .bash_logout .dbus .mozilla QtStudy .sudo_as_admin_successful .xinputrc
.. 视频 音乐 .bashrc .gnupg pdf Shell_Program .sys1og.conf
2022job 图片 桌面 .cache linux .pki snap .thunderbird
读书笔记 文档 自学 .config LinuxBoard .presage .sogouinput .vscode
公共的 下载 .bash_history C_Program .local .profile .ssh .wget-hsts
cjh@cjh-PC:~$
20. alias
alias命令 允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。
cjh@cjh-PC:~$ alias li='ls -li'
cjh@cjh-PC:~$ li
总用量 76
794057 drwxrwxr-x 3 cjh cjh 4096 3月 16 14:41 2022job
786994 drwxr-xr-x 3 cjh cjh 4096 1月 27 2021 读书笔记
786490 drwxr-xr-x 2 cjh cjh 4096 11月 16 23:06 公共的
786489 drwxr-xr-x 2 cjh cjh 4096 11月 18 20:07 模板
786494 drwxr-xr-x 2 cjh cjh 4096 2月 26 20:58 视频
786493 drwxr-xr-x 2 cjh cjh 4096 2月 26 15:48 图片
786491 drwxr-xr-x 3 cjh cjh 4096 2月 26 21:05 文档
786488 drwxr-xr-x 3 cjh cjh 4096 3月 16 22:44 下载
787012 drwxr-xr-x 4 cjh cjh 4096 1月 21 2021 项目工程文件
920546 drwxr-xr-x 2 cjh cjh 4096 11月 16 23:06 音乐
786487 drwxr-xr-x 2 cjh cjh 4096 2月 26 11:47 桌面
790339 drwxr-xr-x 4 cjh cjh 4096 3月 16 22:01 自学
1051116 drwxrwxr-x 12 cjh cjh 4096 3月 14 21:26 C_Program
1441977 drwxrwxr-x 11 cjh cjh 4096 2月 26 12:31 linux
791668 drwxr-xr-x 5 cjh cjh 4096 2月 24 11:31 LinuxBoard
920211 drwxr-xr-x 4 cjh cjh 4096 11月 18 21:27 pdf
920231 drwxr-xr-x 4 cjh cjh 4096 2月 22 19:03 QtStudy
793863 drwxrwxr-x 2 cjh cjh 4096 3月 15 19:18 Shell_Program
920246 drwx------ 6 cjh cjh 4096 2月 27 13:08 snap
cjh@cjh-PC:~$
21. 全局环境变量 局部环境变量 用户定义变量( env, printenv, =" ", export, unset )
全局环境变量是可以被子shell继承的。
cjh@cjh-PC:~$ echo $HOME
/home/cjh
cjh@cjh-PC:~$ bash
cjh@cjh-PC:~$ echo $HOME
/home/cjh
cjh@cjh-PC:~$
局部环境变量只会对 该shell进程可见。其子shell进程是看不到的。
设置局部环境变量方法如下:( 变量名、等号和值之间没有空格,这一点非常重要! 值有空格的话,加双引号 )
cjh@cjh-PC:~$ echo $weight
cjh@cjh-PC:~$ weight="2 tons"
cjh@cjh-PC:~$ echo $weight
2 tons
cjh@cjh-PC:~$ bash
cjh@cjh-PC:~$ echo $weight
cjh@cjh-PC:~$
设置全局环境变量方法如下:export!!! 这样对其子进程就可见了。
cjh@cjh-PC:~$ height="2 m"
cjh@cjh-PC:~$ export height
cjh@cjh-PC:~$ echo $height
2 m
cjh@cjh-PC:~$ bash
cjh@cjh-PC:~$ echo $height
2 m
PS: 子shell进程中对 全局环境变量的改变,并不影响父shell 中的值。
使用 unset 删除全局或者局部变量:
cjh@cjh-PC:~$ echo $height
2 m
cjh@cjh-PC:~$ unset height
cjh@cjh-PC:~$ echo $height
22. PATH
PATH (全局)环境变量定义了用于进行命令和程序查找的目录。
cjh@cjh-PC:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
cjh@cjh-PC:~$
可以采用技巧,把新的路径加入PATH:
$ PATH=$PATH:/home/christine/Scripts # Add new path as a tail
$ PATH=$PATH:. # Add current directory as a new path
23. 启动文件 ( /etc/profile.d/*.sh, ~/.bashrc )
为了让我们对PATH等 全局环境变量的改变永久化,我们需要修改启动文件。主要是这2个:
/etc/profile.d/*.sh, ~/.bashrc
- 本地shell( 上电后登录的shell )
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行
这个启动文件。根据该文件的内容:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
我们通过修改或者新增 /etc/profile.d/下的 sh脚本,来设置全局环境变量:
cjh@cjh-PC:~$ ls /etc/profile.d/
01-locale-fix.sh bash_completion.sh deepin-wine.i-m.dev.sh vte-2.91.sh xdg_dirs_desktop_session.sh
apps-bin-path.sh cedilla-portuguese.sh im-config_wayland.sh vte.csh
- 交互式shell( 开机以后,再打开的终端 或者 远程访问的SSH )
如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查 $HOME/.bashrc
所以,我们就修改$HOME/.bashrc。( 其实 $HOME/.bashrc也是被$HOME/.profile触发的 )