Linux命令行与shell脚本编程之笔记(2)

本文介绍了Linux shell中的关键概念,包括父shell与子shell的关系,如何查看进程(如使用`ps -f --forest`),进程列表的创建,以及协程(coproc)的使用。还详细讲解了外部命令和内部命令的区别,通过`which`和`type`命令来区分。此外,讨论了bash的历史记录功能,别名的创建,以及环境变量的设置、查看和删除。最后提到了`PATH`变量的重要性以及启动文件如`/etc/profile.d/*.sh`和`~/.bashrc`在配置全局环境变量中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

16. 父shell 子shell ( ps -f --forest ) 

17. 进程列表() & 协程  coproc

18. 外部命令 & 内部命令  which  type 

19. history (.bash_history)

20. alias

21. 全局环境变量  局部环境变量  用户定义变量( env, printenv, =" ", export, unset )

22. PATH

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触发的 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值