Skip to the content.

进阶内容

目录


terminal & shell

在此之前,我们刻意忽略了终端(terminal)和 shell 的关系,将它们统称为“终端”、“命令行”

但事实上,终端最初是一种硬件,用于和计算机交换信息的输入输出设备,例如电传打印机。而随着计算机系统硬件一体化水平提高,如今的终端通常指“终端模拟器”,是一类用于人机交互的软件,例如

不同终端之间可能有界面、字体、字符集等不同,但若已经到了可以输入命令使用系统的阶段,终端间的差异基本就影响不大了

而 shell 则是实质去解释指令、执行指令、返回执行结果的软件,常见的有

不同 shell 间可能有内建命令、默认配置文件等不同,因此需要留意使用的 shell

可以通过SHELL环境变量来检查当前运行的 shell,即echo $SHELL

关于物理设备、终端(模拟器)、shell 的一个不太严谨的关系示意图如下

terminal--shell-1.drawio.png

shell 脚本

TODO


dotfiles

在如今很多 Linux 发行版中,用户主目录~下经常存在.profile.bashrc(bash 环境)、.zshrc(zsh 环境)一类的文件

这些文件以.开头(表示为 Linux 系统中的隐藏文件,在ls时需使用-a参数才能列出),因而得名 “dotfile” (直译为“点文件”)

它们的作用是保存一些开发环境和工具的配置信息,由对应的环境或工具在启动时自动读取或执行

.bashrc

.bashrc为例,它是 shell 程序 bash 的配置文件,或者说是启动脚本(即程序启动时自动执行的 shell 脚本),主要功能有:

对这类 shell 配置文件而言,最常见的用途便是定义别名,如 Ubuntu 20.04 LTS 系统自带的.bashrc

$ cat ~/.bashrc
...
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
...

就定义了三个与列出目录文件ls命令有关的别名,简化了参数的使用

若需定义更多别名,也只需这样在文件任意位置(建议放在一起便于管理)添加一行alias name="cmd"即可

后台运行

在使用 Linux 时不难发现,当关闭终端时,正在执行的命令也会终止

这是因为“执行命令”实际上是创建了一个 shell 的子进程,使用

$ ps -f
UID       PID  PPID  C STIME TTY          TIME CMD
user     3509    33  6 18:37 pts/3    00:00:00 /usr/bin/zsh -i
user     3545  3509  0 18:37 pts/3    00:00:00 ps -f

可以看到psPPID(即父进程 pid)等于zshPID

而 shell 退出时,会向子进程发出SIGHUP信号,收到该信号的子进程自行退出

但我们有时希望执行的命令保持运行(例如用 Python 训练一个深度神经网络,肯定不希望在漫长的等待中必须保持终端打开),常见的方法有如下几种

nohup &

用法:nohup <cmd> &

nohup全称为 no hang up,意为“不挂起”,它会使<cmd>创建的子进程忽略SIGHUP信号

结尾的&表示后台运行,避免 shell 阻塞地等待命令运行结束

screen