Unix即IDE

前言

在圖形界面下你們都想要這種可以集成在一塊兒的工具,那是由於這類窗口應用除了用複製粘貼,沒有別的方法使他們更好地協同工做,它們缺失一種 共用接口(common interface) 。html

有關這個問題有趣的是,對於 shell 用戶來講這些設計巧妙、經久不衰的 Unix 工具已經有共用接口了,要麼是以文本流的形式,要麼是以持久化文件對象的形式,這用一句 Unix 世界的格言說就是「一切皆文件」。Unix 裏幾乎全部東西都是圍繞這兩個基本概念來組建的,加之,這些有着40年曆史的高性能工具的用戶和開發者都極具一流的互用性,這些都爲 Unix 能成爲一個足夠強大、成熟而全面的 IDE 打下了堅實基礎。git

來自 https://conanblog.me/Unix-as-IDE--Chinese-/introduction.htmlshell

文件

列舉文件

ls -a顯示隱藏 -A隱藏不顯示.和.. -l詳細信息vim

選項 做用
-t 按最後編輯的時間排序,最新的最早
-X 按文件類型分類
-v 按文件名裏的版本號排序
-S 按文件大小排序
-R 遞歸地列舉文件

ls -XR |vim -dom

直接將文本導入相似vimssh

查找文件 (基於文件屬性)

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符號連接

能夠組合使用

能夠添加後續動做,如svg

選項 做用
-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工具,替代grepsvn

  • 文件元數據

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)
相關文章
相關標籤/搜索