任务控制
大多数情况下,我们可以使用 Ctrl-C
来停止命令的执行。其原理是什么呢?
结束进程
首先,shell是使用UNIX提供的“信号机制”来执行进程间通信的。
当一个进程接收到信号时,它会停止执行、处理该信号并基于信号传递的信息来改变其执行。
- 而当我们键入
Ctrl-C
时,其发出的信号是SIGINT - 而输入
Ctrl-\
可以发送SIGQUIT
信号。
像这样的信号还有很多种,例如SIGTEAM
它的键入命令是kill命令
kill命令演示:
kill命令可以通过多种方式杀死进程,最常见一种就是,通过进程号,也就是PID。
pidof 命令
pidof命令用于查询某个指定服务进程的PID值
格式为“pidof [参数] [服务名称]”。
每个进程的进程号码值(PID)是唯一的,因此可以通过PID来区分不同的进程。
命令效果**
- 即可得出该服务的进程id(这时候的火狐对应着81904进程号)
有了pid之后,我们就可以使用kill命令来终止某个指定PID的服务进程
格式为“kill [参数] [进程PID]”
- 输入 kill 命令之后,前台运行着的火狐浏览器瞬间就被终结掉了
暂停和后台执行进程
信号可以让进程做其他的事情,而不仅仅是终止它们。例如,SIGSTOP
会让进程暂停。在终端中,键入 Ctrl-Z
会让 shell 发送 SIGTSTP
信号。
我们可以使用 fg 或 bg 命令恢复暂停的工作。它们分别表示在前台继续或在后台继续。
- 使用jobs可以查看当前的进程以及状态、任务编号等等
- 如果我们使用 fg %1 (数字1是指定jobs中的进程编号),就可以将其回复到前台工作
- 当前 bg也是一样的,使用命令中的
&
后缀可以让命令在直接在后台运行
终端多路复用
- 会话- 每个会话都是一个独立的工作区,其中包含一个或多个窗口
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