• 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.
    ";'
    $ 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)
    
  • 相关阅读:
    随笔分类目录
    数据结构与算法
    ASP.NET Web网站中App_Code文件夹的作用及使用场景
    Java语言入门
    C#语言入门_基本介绍
    汇编语言入门
    学期总结
    王者光耀作业2
    王者光耀作业1
    第三次作业
  • 原文地址:https://www.cnblogs.com/logchen/p/10346530.html
Copyright © 2020-2023  润新知