前言

在图形界面下大家都想要这种能够集成在一起的工具,那是因为这类窗口应用除了用复制粘贴,没有别的方法使他们更好地协同工作,它们缺失一种 共用接口(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.\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指令
$< 指源文件,$*指没有后缀的文件名,$@指目标文件
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)

Unix即IDE的更多相关文章

  1. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  2. dotfiles for linux/unix users automatically! (python Vim IDE)

    Here is a brief introduction and package of dotfiles for linux/unix user. I think there are enough i ...

  3. Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)

    此配置实例亲测成功,共勉,有问题大家留言. 环境:VMware 10 + unbuntu 14.04 为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和a ...

  4. 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  5. 【转】Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)

    下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程.这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端. 这里涉及到了编写代码,因此要 搭建unix网络编程环境 unix系 ...

  6. IDE编辑器编码配置

    做跨平台开发时,大家用不同的IDE合作开发,最令人头疼的事就是各种乱码问题. 常用的IDE都支持utf-8编码和unix格式行尾'\n'. 1.XCODE设置文本编码及换行Xcode >> ...

  7. 渣渣小本求职复习之路每天一博客系列——Unix&Linux入门(5)

    前情回顾:昨天简单地介绍了一下如何使用vi编辑器,例如命令模式和插入模式的切换,以及一些简单命令的讲解. —————————————————————————直接就开始吧———————————————— ...

  8. 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs

    只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs [ide is evil] (http://i.cnblogs.com/EditP ...

  9. 无IDE时编译和运行Java

    最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...

随机推荐

  1. Anagram字符串处理(STL真方便啊。。)

    题意:给出一些字符串,认为各个字符个数相同的字符串就是相同的,不区分大小写,找出这些字符串中不与其他字符串相同的字符串并挨个输出 用char orgin[][]把每个字符串保存起来,然后对每个字符串都 ...

  2. HD ACM 水题顺序

    原文传送门:http://acm.hdu.edu.cn/ 第一阶段:开始入门吧!(15天,53题) 一.输入输出练习(2天,10题) 1000.1089-1096.1001 二.简单操作:(2-4天, ...

  3. ubuntu mariadb installation

    sudo apt-get install mariadb-server[sudo] password for wadmin: Reading package lists... DoneBuilding ...

  4. ansible 自动化运维

    Ansible 自动化运维 ansible安装epel #yum list all *ansible*#yum install *ansible*#yum info ansible#rpm -ql a ...

  5. MongoDB慢查询性能分析

    最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢.   刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...

  6. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  7. PHP之魔术方法

      PHP中的魔术方法: PHP的魔术方法主要是在特定的条件下执行相应的魔术方法.这和很多框架中的钩子函数有些类似,不同的是,钩子函数是在生命周期的某个周期内自动执行,而魔术方法是在触发某种条件下自动 ...

  8. Linux 的基本命令

    Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E……盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...

  9. C++中关于字符串的一些API

    参考资料:http://www.runoob.com/cplusplus/cpp-strings.html 一.前言 不管是在编写何种语言程序,需要从输入设备中获取数据的需求很频繁,在这类频繁的应用场 ...

  10. anki_vector SDK源码解析(教程)

    一:最近anki vector robot开放了Python SDK,我听到的第一时间就赶快上网查了查,先抛几个官网重要链接吧: Python编程API手册及环境搭建等: https://sdk-re ...