Unix即IDE
前言在图形界面下大家都想要这种能够集成在一起的工具,那是因为这类窗口应用除了用复制粘贴,没有别的方法使他们更好地协同工作,它们缺失一种?共用接口(common interface)?。 有关这个问题有趣的是,对于 shell 用户来说这些设计巧妙、经久不衰的 Unix 工具已经有共用接口了,要么是以文本流的形式,要么是以持久化文件对象的形式,这用一句 Unix 世界的格言说就是“一切皆文件”。Unix 里几乎所有东西都是围绕这两个基本概念来组建的,加之,这些有着40年历史的高性能工具的用户和开发者都极具一流的互用性,这些都为 Unix 能成为一个足够强大、成熟而全面的 IDE 打下了坚实基础。 来自 https://conanblog.me/Unix-as-IDE--Chinese-/introduction.html 文件列举文件ls -a显示隐藏 -A隐藏不显示.和.. -l详细信息
ls -XR |vim - 直接将文本导入类似vim 查找文件 (基于文件属性)find | sort 常用过滤语句
可以组合使用可以添加后续动作,如
搜索文件 (基于文件内容)
-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
file 对所给文件一行简短的介绍
编辑器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.n";‘ $ perl <<<‘print "Hello world.n";‘ $ echo ‘print "Hello world.n";‘ | perl 将代码保存在文件 $ perl hello.pl 用-c不运行,检查代码 $ perl -c hello.pl 直接运行,不需要知道脚本类型 #!/usr/bin/env perl 加x权限,执行./hello 构建make不仅仅用于自动化编译,凡是把一堆文件生成另一堆文件的情况都可以利用它。如网站部署时将原图片优化成网页友好的图片;从代码生成静态的HTML页面,而不是运行时生成页面。 剖析Makefile 每个目标文件都包含一系列的依赖项,定义的顺序是任意的。 其他使用 svg矢量图生成png图 Makedown源文件生成HTML文件 用./SUFFIXES指令 $< 指源文件,$*指没有后缀的文件名,[email?protected]指目标文件 icons: create.png read.png update.png delete.png .SUFFIXES: .svg .png .svg.png: convert $< $*.raw.png && pngcrush $*.raw.png [email?protected] 创建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",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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |