Unix即IDE
前言
在图形界面下大家都想要这种能够集成在一起的工具,那是因为这类窗口应用除了用复制粘贴,没有别的方法使他们更好地协同工作,它们缺失一种 共用接口(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的更多相关文章
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...
- 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 ...
- Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)
此配置实例亲测成功,共勉,有问题大家留言. 环境:VMware 10 + unbuntu 14.04 为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和a ...
- 10 款最好的 Python IDE
Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...
- 【转】Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)
下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程.这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端. 这里涉及到了编写代码,因此要 搭建unix网络编程环境 unix系 ...
- IDE编辑器编码配置
做跨平台开发时,大家用不同的IDE合作开发,最令人头疼的事就是各种乱码问题. 常用的IDE都支持utf-8编码和unix格式行尾'\n'. 1.XCODE设置文本编码及换行Xcode >> ...
- 渣渣小本求职复习之路每天一博客系列——Unix&Linux入门(5)
前情回顾:昨天简单地介绍了一下如何使用vi编辑器,例如命令模式和插入模式的切换,以及一些简单命令的讲解. —————————————————————————直接就开始吧———————————————— ...
- 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs
只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs [ide is evil] (http://i.cnblogs.com/EditP ...
- 无IDE时编译和运行Java
最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...
随机推荐
- 2019-04-28-day042-HTML初识
GET / HTTP/1.1 Host: 127.0.0.1:9001 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml ...
- web移动端类型检测
移动端检测 插件通用下载: https://www.bootcdn.cn/ 根据一个库 device.js 下载地址 传送 api 传送 和 传送 常用检测类型 device.ipad() 返回一个布 ...
- 虚拟机centos7服务器下,启动oracle11g数据库和关闭数据库
转载:https://blog.csdn.net/ShelleyWhile/article/details/74898033 一.前提条件:虚拟机centos7服务器下,已经安装好oracle11g数 ...
- json模块
dic = {"name":"boke","age":"18"} #字典 data = json.dumps(dic) ...
- python第一条代码
#!usr/bin/env python #-*-coding:utf-8 -*- print("hello,world")
- 小程序视频播放组件video
最近在做一个视频播放的功能,要求如下: 1.实现视频的全屏播放: 2.实现视频相关信息的展示: 3.实现视频滑动上下切换效果: 肯定选择用原生组件video了,真是不用不知道,一用都是坑: 首先,组件 ...
- 小妖精的完美游戏教室——人工智能,A*算法,实现篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- linux使用"userdel 用户名“删除用户的解决办法
在新建用户的时候我们可以忽略掉给用户分组的信息,而直接使用“useradd 用户名” 来直接添加新用户,所以由此想到删除用户能不能直接使用“userdel 用户名”来删除用户呢?回答是否定的,如此会残 ...
- 在Javascript中闭包(Closure)
在Javascript中闭包(Closure) 什么是闭包 “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ...
- Linux 系统的用户和组
目录 1. 用户及组相关文件 2. 用户相关查询 2.1 直接通过cat文件查看用户及组文件内容 2.2 使用下面查询命令查看 3. 使用操作命令修改用户及组相关文件 3.1 专有编辑命令(仅限高级用 ...