任务控制

大多数情况下,我们可以使用 Ctrl-C 来停止命令的执行。其原理是什么呢?

结束进程

首先,shell是使用UNIX提供的“信号机制”来执行进程间通信的。
当一个进程接收到信号时,它会停止执行、处理该信号并基于信号传递的信息来改变其执行。

  • 而当我们键入Ctrl-C 时,其发出的信号是SIGINT
  • 而输入Ctrl-\可以发送SIGQUIT 信号。

像这样的信号还有很多种,例如SIGTEAM它的键入命令是kill命令

kill命令演示:

kill命令可以通过多种方式杀死进程,最常见一种就是,通过进程号,也就是PID。

pidof 命令
pidof命令用于查询某个指定服务进程的PID值
格式为“pidof [参数] [服务名称]”。
每个进程的进程号码值(PID)是唯一的,因此可以通过PID来区分不同的进程。

命令效果**
5. 命令行环境 - 图1

  • 即可得出该服务的进程id(这时候的火狐对应着81904进程号)

有了pid之后,我们就可以使用kill命令来终止某个指定PID的服务进程
格式为“kill [参数] [进程PID]”

命令效果
5. 命令行环境 - 图2

  • 输入 kill 命令之后,前台运行着的火狐浏览器瞬间就被终结掉了

暂停和后台执行进程

信号可以让进程做其他的事情,而不仅仅是终止它们。例如,SIGSTOP 会让进程暂停。在终端中,键入 Ctrl-Z 会让 shell 发送 SIGTSTP 信号。

我们可以使用 fg 或 bg 命令恢复暂停的工作。它们分别表示在前台继续或在后台继续。

  • 使用jobs可以查看当前的进程以及状态、任务编号等等
  • 如果我们使用 fg %1 (数字1是指定jobs中的进程编号),就可以将其回复到前台工作
  • 当前 bg也是一样的,使用命令中的 & 后缀可以让命令在直接在后台运行

image.png


终端多路复用


  • 会话- 每个会话都是一个独立的工作区,其中包含一个或多个窗口
    • tmux 开始一个新的会话
    • tmux new -s NAME 以指定名称开始一个新的会话
    • tmux ls 列出当前所有会话
    • tmux 中输入 <C-b> d ,将当前会话分离
    • tmux a 重新连接最后一个会话。您也可以通过 -t 来指定具体的会话
  • 窗口- 相当于编辑器或是浏览器中的标签页,从视觉上将一个会话分割为多个部分
    • <C-b> c 创建一个新的窗口,使用 <C-d>关闭
    • <C-b> N 跳转到第 N 个窗口,注意每个窗口都是有编号的
    • <C-b> p 切换到前一个窗口
    • <C-b> n 切换到下一个窗口
    • <C-b> , 重命名当前窗口
    • <C-b> w 列出当前所有窗口
  • 面板- 像 vim 中的分屏一样,面板使我们可以在一个屏幕里显示多个 shell
    • <C-b> " 水平分割
    • <C-b> % 垂直分割
    • <C-b> <方向> 切换到指定方向的面板,<方向> 指的是键盘上的方向键
    • <C-b> z 切换当前面板的缩放
    • <C-b> [ 开始往回卷动屏幕。您可以按下空格键来开始选择,回车键复制选中的部分
    • <C-b> <空格> 在不同的面板排布间切换

别名

别名即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”(注意等号左右不能右空格)。
若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。

还有一点,当我们仅仅在终端窗口自定义的别名,在下一次打开终端,那这个别名会消失,就像一个临时变量
如何配置一份永久的别名呢? 那就是在~/.bashrc中配置,每次终端启动时都会这个文件夹。

配置文件(vim、bash等等)也是跟以上同个道理:有兴趣了解的可以戳 :教程

ssh

这个知识点呢,因为之前也弄过云服务器,就有一点经验,我后面是通过vs code 来完成ssh这些操作的,然后也可以实现本地开发,非常简便。

然后之前也是玩过git,就知道大概怎么配置,对我来说这种搭建环境式的知识点不用太过在意,用到了stackoverflow就行了。

  • ssh jjgo@192.168.242.122
  • ssh jjgo@foobar.mit.edu 具有 DNS 名称的服务器
  • 直接远程执行命令
    • ssh foobar@server ls
    • ssh foobar@server ls | grep PATTERN

配置文件(Dotfiles)

  • 编辑 .bashrc.bash_profile 来进行配置
  • 确保程序能够被 shell 找到
    • export PATH="$PATH:/path/to/program/bin"
  • 配置文件的管理方法
    • 使用版本控制系统进行管理
    • 然后通过脚本 (GNU stow) 将其 符号链接(ln -s aaa.log aaa) 到需要的地方

可移植性

  • 配置文件可能并不能在多种设备上生效,针对不同的设备编写不同的配置:

    if [[ “$(uname)” == “Linux” ]]; then {do_something}; fi

    使用和 shell 相关的配置时先检查当前 shell 类型

if [[ “$SHELL” == “zsh” ]]; then {do_something}; fi

您也可以针对特定的设备进行配置

if [[ “$(hostname)” == “myServer” ]]; then {do_something}; fi