在圖形界面下你們都想要這種可以集成在一塊兒的工具,那是由於這類窗口應用除了用複製粘貼,沒有別的方法使他們更好地協同工做,它們缺失一種 共用接口(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 {} + |
-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 對所給文件一行簡短的介紹
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)