MIT 6.Null 命令行环境部署

MIT 6.Null 命令行环境部署

长期使用 Shell 的程序员应该如何通过优化工作流来节约时间呢?我想可以从以下四点出发,一是提高任务并行度,通过 Job 控制TMUX 配合;二是简化或优化命令,通过 AliaseDotfiles 去配置实现;三是远程访问;四是美化 Shell 界面,良好的 ui 也能极大提高工作效率。

Job 控制

当我们需要中断 Job 时,通常是因为命令完成时间过长(比如因为网络问题导致 brew update 卡住),通常会按下 <Ctrl c>。这个组合键本质上是让 Shell 向当前进程传递信号 SIGINT

Shell 使用一种称为 信号unix 通信机制 向进程传递信息从而改变执行流程,因此信号是 软件中断

杀死进程

杀死进程 有两种方式,键入 Ctrl c 从而发送 SIGINT 信号给进程,或者键入 Ctrl \ 从而发送 SIGQUIT 信号给进程。

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr.bin/env python
import signal, time

def handler(signum, time):
print("\ni got a sigint, but i am not stopping")

signal.signal(signal.sigint, handler)
i = 0
while true:
time.sleep(.1)
print("\r{}".format(i), end="")
i += 1

kill process

当然,一种更优雅直接的方式是向进程传递 SIGTERM 信号,利用 kill 命令向进程发送信号。

kill -l

暂停或将进程放入后台

想要让运行的 Job 暂停,可以键入 Ctrl z 发送信号 SIGTSTP,这里面的 TSTPTerminal Stop 的缩写。而之后则可以使用 bg 或者 fg 命令将暂停的任务继续运行。

前后台Job控制

想要查看更多信号相关信息,可以点击 here,或者直接键入 man signal 在终端查看。

终端多路复用器

一次性运行多个任务的时候,我们可以同时开多个终端窗口监视它们进度,但在命令行界面使用终端多路复用器是一种更加通用的解决方案,尤其在远程连接机器的时候。

tmux demo

最流行的终端多路复用器就是 TMUX,可以自己配置快捷键来快速创建和切换标签和界面。在 TMUX 中,一个 Session 就是一个独立的工作空间可以有多个窗口,而一个窗口就是一个可视标签同一个 Session 可以切割出多个窗口,一个窗口可以分为多个 Pane

  • Sessions
    • tmux 打开一个新的 session
    • tmux new -s NAME 打开一个新的 session 并命名
    • tmux ls 列出当前 sessions
    • <Ctrl b> d 在 session 内部键入这个命令可以退出当前 session
    • tmux a 进入上一个 session,也可以用 - t 进入指定 session
  • Windows
    • <Ctrl b> c 创建一个新窗口
    • <Ctrl b> N 切换到第 N 个窗口
    • <Ctrl b> p 切换到上一个窗口
    • <Ctrl b> n 切换到下一个窗口
    • <Ctrl b> ,重命名当前窗口
    • <Ctrl b> w 列出所有窗口
  • Panes
    • <Ctrl b> " 水平切割窗口
    • <Ctrl b> % 竖直切割窗口
    • <Ctrl b> <direction> 朝特定方向移动 pane
    • <Ctrl b> z 放大当前 pane

这里有关于 tmux 的快速教程。

Aliases

Shell 支持 Aliasing,即用一个较短的指令作为一个长命令的别名从而减少我们的工作量,通常的用法如下:

1
alias alias_name="command_to_alias arg1 arg2"

比较常用过的设定有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# User specific aliases and functions
alias ll="ls -lh"

alias gs="git status"
alias gc="git commit"
alias v="vim"

alias sl=ls

alias mv="mv -i" # -i prompts before overwrite
alias mkdir="mkdir -p" # -p make parent dirs as needed
alias df="df -h" # -h prints human readable format

alias la="ls -A"
alias lla="la -l"

如果要将别名持久化,我们需要将其配置到 shell 启动文件中,比如 .bashrc 或者 .zshrc,这些文件又被称为 Dotfile

Dotfiles

许多程序都会用一个以. 开头的文本文件作为配置文件,我们称这些文件为 Dotfiles,当我们输入 ls 时它们默认隐藏。Shell 在启动时会读取很多文件并加载其配置,根据 Shell 的不同,无论是登录还是交互都很复杂,这里是关于这个问题的参考。

每个人都会对自己的 Dotfiles 有特别的配置,6.null 提供了助教们的配置:

远程访问

我们可以通过使用 Secure ShellSSH 来远程连接计算机,通常输入这样的一条指令:

1
ssh foo@bar.mid.edu

这里我们尝试以用户 foo 去登录服务器 bar.mid.edu,服务器既可以用 URL 表示也可以用 IP 表示。我们利用 ssh-keygen 生成密钥对,当有多套密钥对时可以用 ssh-agent 去管理。

1
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519

为了不用每次都输入密码这么麻烦,我们可以将我们的公钥复制到远程计算机,因为 ssh 会检查.ssh/authorized_keys 来决定哪些客户可以直接连接:

1
2
3
4
# 直接复制文件
cat .ssh/id_ed25519.pub | ssh foobar@remote 'cat >> ~/.ssh/authorized_keys'
# ssh-copy-id
ssh-copy-id -i .ssh/id_ed25519 foobar@remote

当我们想通过 ssh 复制文件时,可以用 scp 命令 scp path/to/local_file remote_host:path/to/remote_file

Shell & Frameworks

TODO

作者

zion h4

发布于

2022-12-17

更新于

2024-09-08

许可协议

评论