前言
在图形界面下大家都想要这种能够集成在一起的工具,那是因为这类窗口应用除了用复制粘贴,没有别的方法使他们更好地协同工作,它们缺失一种 共用接口(common interface) 。
有关这个问题有趣的是,对于 shell 用户来说这些设计巧妙、经久不衰的 Unix 工具已经有共用接口了,要么是以文本流的形式,要么是以持久化文件对象的形式,这用一句 Unix 世界的格言说就是“一切皆文件”。Unix 里几乎所有东西都是围绕这两个基本概念来组建的,加之,这些有着40年历史的高性能工具的用户和开发者都极具一流的互用性,这些都为 Unix 能成为一个足够强大、成熟而全面的 IDE 打下了坚实基础。
来自 https://conanblog.me/Unix-as-IDE--Chinese-/introduction.html
文件
列举文件
ls -a显示隐藏 -A隐藏不显示.和.. -l详细信息
选项 | 作用 |
---|---|
-t | 按最后编辑的时间排序,最新的最先 |
-X | 按文件类型分类 |
-v | 按文件名里的版本号排序 |
-S | 按文件大小排序 |
-R | 递归地列举文件 |
ls -XR |vim -
直接将文本导入类似vim
查找文件 (基于文件属性)
find | sort
find [path] ls | sort -k 11 对第11列排序
常用过滤语句
命令 | 作用 |
---|---|
find -name '*.c' | 查找符合pattern的文件名的文件,iname开启大小写不敏感 |
find -path 'test' | 查找符合pattern的路径的文件,ipath开启大小写不敏感 |
find -mtime -5 | 查找5天内修改过的文件。+5查找5天前修改过的文件 |
find -newer server.c | 查找比server.c新的文件 |
find -type d | 查找目录,f常规文件,l符号链接 |
可以组合使用
可以添加后续动作,如
选项 | 作用 |
---|---|
-ls | 提供类似ls -l的列表 |
-delete | 删除符合查找条件的文件 |
-exec | 对每个找到的文件运行某个命令,命令以 ; 或者 + 终结 。find -name '.pl' -exec perl -c {} ; find -name '.c' -exec vim {} + |
搜索文件 (基于文件内容)
- grep
-F 固定字符串
-i 大小写不敏感
-H 前面显示文件名
-l 只输出匹配的文件名
处理文件名中的空格和其他特殊字符
grep -lR someVar | while IFS= read -r file; do
head "$file"
done
移除某些目录
$ grep -R 'someVar' . | grep -vF '.svn'
或者--exclude和--exclude-dir
-
ack工具,替代grep
-
文件元数据
file 对所给文件一行简短的介绍
- 模式匹配
- shell展开
编辑器
vim :help
文件类型侦测
if has("autocmd")
filetype on
filetype indent on
filetype plugin on
endif
语法高亮
syntax on或syntax enable
行号
set number
set relativenumber 相对行号
标签文件
ctags,快速在整个项目中搜索某个特定的标识符。直接从变量使用的地方调到声明的地方。
在根目录下,运行:!ctags -R来生成tags文件,此文件是整个项目里所有声明和标识符的位置。
生成之后,可以像这样:tag someClass来搜索
:tn和:tp来遍历搜索结果。
调用外部程序
:!<command> 想把运行结果输出到vim buffer时很有用
:shell 以vim子进程的方式弹开一个命令行,适合交互式命令
Lint程序和语法检查器
调用外部程序(如perl -c,gcc)检查
:!perl -c % 其中%表示当前显示的内容
可以在.vimrc中设置成命令,甚至在设置一个组合键
command PerlLint !perl -c %
nnoremap <leader>l :PerlLint<CR>
利用vim自带的quickfix窗口。
首先对特定的文件类型设置一个合适的makeprg,这个例子里,包含被vim用以输出到quicklist的模块并定义两种输出格式
:set makeprg=perl -c -MVi::QuickFix %
:set errorformat+=%m at %f line %l.
:set errorformat+=%m at %f line %l
可以先安装libvi-quickfix-perl模块。安装完成,保存文档,然后输出:make来检查语法
如果找到错误了可以用:copen打开quicklist窗口,用:cn和:cp上下移动
从其他命令读取输出
:r!ls 把命令的回显直接贴到当前文档
:r ~/.ssh/id_rsa.pub 读进文件的内容
从其他命令过滤输出
可以把vim buffer的文字放进外部命令过滤,或者选取文本块,然后用命令的输出结果覆盖。
因为块选择很适合用在处理列表数据,所有适合配合column,cut,sort,awk等工具使用
:%!sort -k2 -r 将整个文件按二进制逆序排列
:'<,'>!awk '/vim/' {print $3} ' 在所选择的的文字中找到符合/vim/样式并只显示第3列
:1,10!column -t 把前10行的关键词用漂亮的行列格式排好
对比文件
vimdiff 允许查看不同版本文件的区别,提供三向合并以解决版本冲突。
可以用:diffput和:diffget来选择合适的代码段
$vimdiff file-v1.c file-v2.c
版本控制
直接调用版本控制的命令 插件Fugitive
编译
gcc Clang
目标码的编译和汇编
gcc -c example.c -o example
objdump -D example.o 检查汇编代码
gcc -c -S example.c -o example.s 输出汇编码
gcc -c -g -Wa,-a,-ad example.c > example.lst 汇编码和源代码一起打印
预处理器
用来将头文件和宏定义加入到代码里
cpp example.c 打印将要被编译的完整版代码
目标码的链接
gcc example.o -o example
编译装配链接
gcc example.c -o example
-I/xxx头文件 -L动态库路径 -l动态库
-l被依赖的库放在后面
编译计划
查看gcc都干了些什么,加-v将编译计划从标准错误中打印
gcc -v -c example.c -o example.o
如果不需要真的产生目标文件
gcc -### -c example.c -o example.o
更详细的错误查看
加上-Wall和/或-pedantic输出不一定会产生错误的警告
gcc -Wall -pedantic -c example.c -o example.o
将其放进Makefile或vim的makeprg是个好主意。
它们在快速修正(quickfix)窗口里的输出效果很好。这种高强度的错误警告往往会使你写出可读性更强、兼容性更好、更少错误的代码。
编译时间剖析
输出每一步所用的时间 gcc -time -c example.c -o example.o
优化
构建更加高效的目标文件和二进制文件,编译会花更多的时间
-O2是个适中的选择
解释器
内联
运行perl代码字符串
$ perl -e 'print "Hello world.
";'
$ perl <<<'print "Hello world.
";'
$ echo 'print "Hello world.
";' | perl
将代码保存在文件
$ perl hello.pl
用-c不运行,检查代码
$ perl -c hello.pl
直接运行,不需要知道脚本类型
#!/usr/bin/env perl
加x权限,执行./hello
构建
make不仅仅用于自动化编译,凡是把一堆文件生成另一堆文件的情况都可以利用它。如网站部署时将原图片优化成网页友好的图片;从代码生成静态的HTML页面,而不是运行时生成页面。
剖析Makefile
每个目标文件都包含一系列的依赖项,定义的顺序是任意的。
其他使用
svg矢量图生成png图
Makedown源文件生成HTML文件
用./SUFFIXES指令
$< 指源文件,$*指没有后缀的文件名,$@指目标文件
icons: create.png read.png update.png delete.png
.SUFFIXES: .svg .png
.svg.png:
convert $< $*.raw.png &&
pngcrush $*.raw.png $@
创建Makefile的工具
从更高层构造configure脚本和make脚本
autoconf和automake
调试
加-g调试标签,-Wall详细错误信息
当错误终止程序之后,输入backtrace可以查看刚刚是哪个功能模块运行了
bread打断点
gdb附到一个正在运行的进程,只需要知道进程ID
$ pgrep example
1524
$ gdb -p 1524
例如想把后台运行程序的输出重定向到/dev/null,同时保持在同一个shell下工作
得到进程ID之后
gdb -p xxxx
p dup2(open("/dev/null",0), 1)
p dup2(open("/dev/null",0), 2)
detach
quit
其他方法
screen提供多个虚拟ttys,而不用打开新的会话
nohup,关闭和重新打开会话,而不会丢失后台进程
用valgrind调试
其中Memcheck工具,可检查类型缓冲区溢出的内存错误
valgrind --leak-check=yes ./example
利用strace和ltrace追踪系统和库的调用
ltrace -o example.ltrace ./example
同样可以附到已经运行的进程上
$ pgrep example
5138
$ ltrace -p 5138
我发觉在调试误连接或在 chroot 环境下缺某些资源时候用 ltrace 特别有用,因为输出信息显示了它在动态连接时搜索库文件、打开 /etc 下的配置文件、以及使用像 /dev/random 或 /dev/zero 这样的设备
利用lsof监视打开的文件
lsof -p 5051
另一种方法
ls -l /proc/5051/fd
在遇到文件锁的令人困惑的情况或者鉴定某进程是否保有不需要的文件时很有用
pmap查看内容分配
pmap 30779
进程可能加载了共享库,而不是唯一在用此库的进程。确认进程使用的真是内存要比想象的复杂。
版本控制
diff,patch和RCS
diff -u example.{1,2}.c
将差异保存成patch
diff -u example.{1,2}.c > example.patch
打补丁
patch example.1.c < example.patch
RCS
ci example.c文件纳入版本控制
co -l example.c 锁定文件
ci -u example.c 更新
rlog查看项目修改历史
rlog example.c
获得两个修改版本之间同一差别格式的补丁
rcsdiff -u -r1.1 -r1.2 ./example.c
CVS和SVN
中心版本控制系统,变更集,分支,标签,合并
git和mercurial
分布式,基本操作单位不是修改集,而是压缩保存的完整的文件(blob)