If you stick to Visual Studio, you will never understand why vim
is called 编辑器之神. If you stick to Windows, you will never know what is Unix Philosophy. If you stick to GUI, you can only do what it can; but in CLI, it can do what you want. One of the most important spirits of young people like you is to try new things to bade farewell to the past.
In Ubuntu, the package manager is called apt
.
Inside NJU, you should easily obtain an IPv6 address. To test this, try to ping a mirror host with IPv6 support:
ping mirrors.tuna.tsinghua.edu.cn -c 4
装 libsdl2-dev 之后的工具出现问题。
‘i’ 进入编辑模式 esc 进入normal 模式
hjkl 上下左右
有时我们希望将程序的输出信息保存到文件中, 方便以后查看. 例如你编译了一个程序myprog
, 你可以使用以下命令对myprog
进行反汇编, 并将反汇编的结果保存到output
文件中:
objdump -d myprog > output
>
是标准输出重定向符号, 可以将前一命令的输出重定向到文件output
中. 这样, 你就可以使用文本编辑工具查看output
了.
但你会发现, 使用了输出重定向之后, 屏幕上就不会显示myprog
输出的任何信息. 如果你希望输出到文件的同时也输出到屏幕上, 你可以使用tee
命令:
objdump -d myprog | tee output
使用输出重定向还能很方便地实现一些常用的功能, 例如
> empty # 创建一个名为empty的空文件
cat old_file > new_file # 将文件old_file复制一份, 新文件名为new_file
如果myprog
需要从键盘上读入大量数据(例如一个图的拓扑结构), 当你需要反复对myprog
进行测试的时候, 你需要多次键入大量相同的数据. 为了避免这种无意义的重复键入, 你可以使用以下命令:
./myprog < data
<
是标准输入重定向符号, 可以将前一命令的输入重定向到文件data
中. 这样, 你只需要将myprog
读入的数据一次性输入到文件data
中, myprog
就会从文件data
中读入数据, 节省了大量的时间.
下面给出了一个综合使用重定向的例子:
time ./myprog < data | tee output
这个命令在运行myprog
的同时, 指定其从文件data
中读入数据, 并将其输出信息打印到屏幕和文件output
中. time
工具记录了这一过程所消耗的时间, 最后你会在屏幕上看到myprog
运行所需要的时间. 如果你只关心myprog
的运行时间, 你可以使用以下命令将myprog
的输出过滤掉:
time ./myprog < data > /dev/null
/dev/null
是一个特殊的文件, 任何试图输出到它的信息都会被丢弃, 你能想到这是怎么实现的吗? 总之, 上面的命令将myprog
的输出过滤掉, 保留了time
的计时结果, 方便又整洁.
Makefile
文件由若干规则组成, 规则的格式一般如下:
目标文件名:依赖文件列表
用于生成目标文件的命令序列 # 注意开头的tab, 而不是空格
我们来解释一下上文中的hello
规则. 这条规则告诉make
程序, 需要生成的目标文件是hello
, 它依赖于文件hello.c
, 通过执行命令gcc hello.c -o hello
来生成hello
文件.
如果你连续多次执行make
, 你会得到"文件已经是最新版本"的提示信息, 这是make
程序智能管理的功能. 如果目标文件已经存在, 并且它比所有依赖文件都要"新", 用于生成目标的命令就不会被执行. 你能想到make
程序是如何进行"新"和"旧"的判断的吗?
上面例子中的clean
规则比较特殊, 它并不是用来生成一个名为clean
的文件, 而是用于清除编译结果, 并且它不依赖于其它任何文件. make
程序总是希望通过执行命令来生成目标, 但我们给出的命令rm hello
并不是用来生成clean
文件, 因此这样的命令总是会被执行. 你需要键入make clean
命令来告诉make
程序执行clean
规则, 这是因为make
默认执行在Makefile
中文本序排在最前面的规则. 但如果很不幸地, 目录下已经存在了一个名为clean
的文件, 执行make clean
会得到"文件已经是最新版本"的提示. 解决这个问题的方法是在Makefile
中加入一行PHONY: clean
, 用于指示"clean
是一个伪目标". 这样以后, make
程序就不会判断目标文件的新旧, 伪目标相应的命令序列总是会被执行.
对于一个规模稍大一点的工程, Makefile
文件还会使用变量, 函数, 调用Shell命令, 隐含规则等功能. 如果你希望学习如何更好地编写一个Makefile
, 请到互联网上搜索相关资料.
Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b
,即先按下Ctrl+b
,快捷键才会生效
# 使用会话编号
$ tmux attach -t 0
# 使用会话名称
$ tmux attach -t <session-name>
# 使用会话编号
$ tmux kill-session -t 0
# 使用会话名称
$ tmux kill-session -t <session-name>
# 使用会话编号
$ tmux switch -t 0
# 使用会话名称
$ tmux switch -t <session-name>
$ tmux rename-session -t 0 <new-name>
Ctrl+b d
:分离当前会话。Ctrl+b s
:列出所有会话。Ctrl+b $
:重命名当前会话。
- 新建会话
tmux new -s my_session
。- 在 Tmux 窗口运行所需的程序。
- 按下快捷键
Ctrl+b d
将会话分离。- 下次使用时,重新连接到会话
tmux attach-session -t my_session
。
tmux split-window
命令用来划分窗格。
# 划分上下两个窗格 $ tmux split-window # 划分左右两个窗格 $ tmux split-window -h
tmux select-pane
命令用来移动光标位置。
# 光标切换到上方窗格 $ tmux select-pane -U # 光标切换到下方窗格 $ tmux select-pane -D # 光标切换到左边窗格 $ tmux select-pane -L # 光标切换到右边窗格 $ tmux select-pane -R
tmux swap-pane
命令用来交换窗格位置。
# 当前窗格上移 $ tmux swap-pane -U # 当前窗格下移 $ tmux swap-pane -D
下面是一些窗格操作的快捷键。
Ctrl+b %
:划分左右两个窗格。Ctrl+b "
:划分上下两个窗格。Ctrl+b <arrow key>
:光标切换到其他窗格。<arrow key>
是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓
。Ctrl+b ;
:光标切换到上一个窗格。Ctrl+b o
:光标切换到下一个窗格。Ctrl+b {
:当前窗格与上一个窗格交换位置。Ctrl+b }
:当前窗格与下一个窗格交换位置。Ctrl+b Ctrl+o
:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。Ctrl+b Alt+o
:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。Ctrl+b x
:关闭当前窗格。Ctrl+b !
:将当前窗格拆分为一个独立窗口。Ctrl+b z
:当前窗格全屏显示,再使用一次会变回原来大小。Ctrl+b Ctrl+<arrow key>
:按箭头方向调整窗格大小。Ctrl+b q
:显示窗格编号。
除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。
tmux new-window
命令用来创建新窗口。
$ tmux new-window # 新建一个指定名称的窗口 $ tmux new-window -n <window-name>
tmux select-window
命令用来切换窗口。
# 切换到指定编号的窗口 $ tmux select-window -t <window-number> # 切换到指定名称的窗口 $ tmux select-window -t <window-name>
tmux rename-window
命令用于为当前窗口起名(或重命名)。
$ tmux rename-window <new-name>
下面是一些窗口操作的快捷键。
Ctrl+b c
:创建一个新窗口,状态栏会显示多个窗口的信息。Ctrl+b p
:切换到上一个窗口(按照状态栏上的顺序)。Ctrl+b n
:切换到下一个窗口。Ctrl+b <number>
:切换到指定编号的窗口,其中的<number>
是状态栏上的窗口编号。Ctrl+b w
:从列表中选择窗口。Ctrl+b ,
:窗口重命名。
下面是一些其他命令。
# 列出所有快捷键,及其对应的 Tmux 命令 $ tmux list-keys # 列出所有 Tmux 命令及其参数 $ tmux list-commands # 列出当前所有 Tmux 会话的信息 $ tmux info # 重新加载当前的 Tmux 配置 $ tmux source-file ~/.tmux.conf