<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    so true

    心懷未來,開創未來!
    隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
    數據加載中……

    Linux學習菁華

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); gdb中顯示長字符串:

    1.       Gdb中可以調用printf做格式化打印:

    printf "%.2000s",s

    x /3uc 0x2341234 #打印地址0x2341234開始的3個單元,每個單元1個byte長,以unsigned int類型顯示出來
    p /t 23423 #以二進制形式打印23423
    2000表示最多打印2000個字符。如果需要打印更長的字符,可以增大該數據。

    break write if $rdi == 2 #如果stderr上有輸出的話,就會break, 引自:https://blogs.oracle.com/ksplice/entry/8_gdb_tricks_you_should

     

    2.       Gdb可以將交互輸出到文件。需要調用如下兩個命令:

    set logging on

    set logging file xxx.txt

    以上兩個命令配合可以起到將長字符串打印到文件的作用。

    但是如果字符串中有若干不可見字符,就不能使用這種方法了。這時候我們需要把數據 dump到文件中。命令如下:

    dump binary memory s.txt s s+1000

     s是一個字符串指針,表示dump的起始位置,s+1000表示dump的末尾。S.txt表示結果
    dump的文件名具體的參數意義可以看gdbmannual


    3.打印東西的長度設置項為

    (gdb) set print elements

    (gdb) set print elements 0

    為全部打出。
    3.1 所有打印的控制都是通過set print來進行的,例如set print pretty on,如果打開printf pretty這個選項,那么當GDB顯示結構體時會比較漂亮。

    4. 對于內存版本的字符串,比如char buffer[1000],可以p buffer@300表示從300后開始打印

    gdb能調試,pstack能打印堆棧信息,core dump文件里有堆棧信息,以及運行時變量的值信息,這些都歸功于symbol table,symbole不光是指變量,也包括函數以及文件名等等,沒有symbol table上述的一切都不可能。gdb里可以通過symbole-file命令來加載一個symbol文件,它可以是可執行的程序,也可以是僅僅含有symbol的文件,舉個例子來說:你把strip test -o test.stripped之后的test.stripped文件給別人去用,一旦core掉了,那個人把core文件給你,你可以用gdb test.stripped core來調試,并通過symbol-file test這個命令來加載symbol table,這樣依然可以正常debug。 當然你也可以只保留test里面的symbol table,通過strip --only-keep-debug test -o test.dbg來生成這個文件,然后gdb test.stripped core,通過symbol-file test.dbg就可以了。
    在這里也提一下生成core文件,調用exit(1)是退出,調用abort()是會產生core文件的(當然要ulimit -c unlimited)。

     

    pbt () {
        yes | gdb -p $1 --eval-command='thread apply all bt full' --eval-command='q'
    }

    bt #查看堆棧信息
    bt full #查看堆棧信息,并同時打印local變量
    f 2 #切換到當前堆棧的第2層
    info locals #查看當前的臨時變量
    info thread #查看目前所有的線程
    thread 2 #切換到2號線程
    break file.c:100 thread 3 #只在3號線程設置斷點
    set scheduler-locking on #只調試當前線程,即不會在調試過程中被其他線程切進來
    info macro DEBUG 你可以查看DEBUG這個宏在哪些文件里被引用了,以及宏定義是什么樣的。 macro DEBUG 你可以查看DEBUG宏展開的樣子;但需要在GCC編譯程序的時候,加上-ggdb3參數,這樣,你就可以調試宏了。
     
    info source可以看到當前運行位置對應的源文件信息;
    info sources可以看到當前運行程序所有的源文件列表;
    info frame可以看到當前運行位置的rip,args位置,棧(存放臨時變量)開始位置

    (gdb) set $idx = 0
    (gdb) p a[$idx++]  #然后就可以一路回車下去了,哈哈
    有時候需要打印一個范圍內的變量值,可以這樣搞:
    while $idx < upper_limit
    p a[$idx++]
    end
    設置條件斷點:b 234 if page == 48
    修改變量的值,用set var a=3,也可以用p a=3

    x/x 以十六進制輸出 x/d 以十進制輸出 x/c 以單字符輸出 x/i  反匯編 – 通常,我們會使用 x/10i $ip-20 來查看當前的匯編($ip是指令寄存器)x/s 以字符串輸出 bt #查看堆棧信息
    bt full #查看堆棧信息,并同時打印local變量
    f 2 #切換到當前堆棧的第2層
    info locals #查看當前的臨時變量
    info thread #查看目前所有的線程
    thread 2 #切換到2號線程
    break file.c:100 thread 3 #只在3號線程設置斷點
    set scheduler-locking on #只調試當前線程,即不會在調試過程中被其他線程切進來
    info macro DEBUG 你可以查看DEBUG這個宏在哪些文件里被引用了,以及宏定義是什么樣的。 macro DEBUG 你可以查看DEBUG宏展開的樣子;但需要在GCC編譯程序的時候,加上-ggdb3參數,這樣,你就可以調試宏了。
       
    (gdb) set $idx = 0
    (gdb) p a[$idx++]  #然后就可以一路回車下去了,哈哈

    gdb -c core.2234 //可以從打印到屏幕上的信息的最后部分看到產生這個core文件的命令包括參數
    gdb a.out core.2234 //可以查看bt信息,也可以看到產生core文件的命令和參數,然后運行set args XXXX就可以設定參數了,然后run就可以重新跑起來,可以在core之前設定breakpoints,當運行到要產生core的那一行(例如是38行),可以用jump 39來跳過該行的執行,這么調試的好處在于可以隨時print 一個函數的運行結果,例如print obj.do(),而程序沒有正在運行時,是無法print一個函數的執行結果的.

    gdb里查看源代碼需要增加額外路徑:
    (gdb) show directories 
    Source directories searched: $cdir:$cwd
    (gdb) directory //這個命令會清空所有路徑,最好別這么干
    (gdb) directory XXX/XXX //這個命令會增加一個搜索的路徑
    gdb查看指針類型時,如果是基類指針,希望看到到底是哪個子類時,使用:
    (gdb) set print object //這個命令可以讓print一個基類指針時,可以看到其到底是哪個子類指針
    gdb查看一個變量的類型,簡單點可以用whatis,如果要查看其完整的聲明,用ptype,如果只想看里面的成員變量,用p *XXX;
    gdb里調用函數,需要程序當前在run才行,例如p str.length();對于std::string類型,調試core文件時用下面命令查看里面的內容:
    printf "String \t\t\t= \"%s\"\n", $arg0._M_dataplus._M_p
    printf "String size/length \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_length
    printf "String capacity \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_capacity
    printf "String ref-count \t= %d\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_refcount
    完整的.gdbinit文件請參見另外一篇帖子http://www.tkk7.com/bacoo/archive/2012/11/07/390979.html

    x/x 以十六進制輸出 x/d 以十進制輸出 x/c 以單字符輸出 x/i  反匯編 – 通常,我們會使用 x/10i $ip-20 來查看當前的匯編($ip是指令寄存器)x/s 以字符串輸出

    如果需要調試stl里面的東西,即可以step into libstdc++中,在ubuntu下的方法如下:
    1。安裝libgcc1-dbg和libstdc++6-4.4-dbg;安裝完之后會發現在/usr/lib/debug/下多了些東西:lib  libstdc++.a  libstdc++.so  libstdc++.so.6  libstdc++.so.6.0.13
    2。$ gdb --quiet test
    (gdb) start
    Temporary breakpoint 1 at 0x8048977: file t5.cpp, line 14.
    Starting program: /home/bacoo/test
    [Thread debugging using libthread_db enabled]

    Temporary breakpoint 1, main (argc=1, argv=0xbfffed64) at t5.cpp:14
    14          size_t pos, begin_pos = 0;
    (gdb) info sharedlibrary
    From        To          Syms Read   Shared Object Library
    0x00110830  0x001277af  Yes (*)     /lib/ld-linux.so.2
    0x00133610  0x0013fad8  Yes (*)     /lib/libpthread.so.0
    0x0018d2e0  0x001fecd8  Yes (*)     /usr/lib/libstdc++.so.6
    0x002374b0  0x002517f8  Yes (*)     /lib/libm.so.6
    0x0025bf50  0x00272438  Yes         /lib/libgcc_s.so.1
    0x0028cac0  0x00396a74  Yes (*)     /lib/libc.so.6
    (*): Shared library is missing debugging information.
    (gdb) show debug-file-directory
    The directory where separate debug symbols are searched for is "/usr/lib/debug".
    (gdb)
    注意,上面的libgcc_s.so.1和libstdc++.so.6兩個lib,其中libgcc已經有symbol了,而libstdc++還沒有symbol(這個是根據Yes之后是否有(*)看出來的),
    如果是這種情況的話,那退出gdb,然后執行:
    $ LD_LIBRARY_PATH=/usr/lib/debug gdb --quiet test
    (gdb) start
    Temporary breakpoint 1 at 0x8048977: file t5.cpp, line 14.
    Starting program: /home/bacoo/test
    [Thread debugging using libthread_db enabled]

    Temporary breakpoint 1, main (argc=1, argv=0xbfffed44) at t5.cpp:14
    14          size_t pos, begin_pos = 0;
    (gdb) info sharedlibrary
    From        To          Syms Read   Shared Object Library
    0x00110830  0x001277af  Yes (*)     /lib/ld-linux.so.2
    0x00133610  0x0013fad8  Yes (*)     /lib/libpthread.so.0
    0x001913a0  0x00212b58  Yes         /usr/lib/debug/libstdc++.so.6
    0x0024c4b0  0x002667f8  Yes (*)     /lib/libm.so.6
    0x00270f50  0x00287438  Yes         /lib/libgcc_s.so.1
    0x002a1ac0  0x003aba74  Yes (*)     /lib/libc.so.6
    (*): Shared library is missing debugging information.
    (gdb)
    哈哈,libstdc++也有了symbol了,這樣就可以設置斷點,然后step into就可以跟蹤到stl的內部了。

    ============================================
    linux下用vpn,安裝openconnect這個包,
    sudo /usr/bin/openconnect --script=/etc/vpnc/vpnc-script Your-Vpn-Server-Address
    ============================================
    > cat close.gdb
    p close(1)
    p close(2)
    #p dup2(open("/dev/null",0),1) #another way to close stdout
    #p dup2(open("/dev/null",0),2) #another way to close stderr
    #p open("/dev/pts/4", 1)     #redirect stdout to another tty
    #p open("/tmp/myerrlog", 1)  #redirect stdout to another file
    detach
    q
    > gdb -p 3465 -x close.gdb

    如果希望每次程序中斷后可以看到即將被執行的下一條匯編指令,可以使用命令
    "display /i $pc"
    其中 $pc 代表當前匯編指令,/i 表示以十六進行顯示。當需要關心匯編代碼時,此命令相當有用。
    undispaly,取消先前的display設置,編號從1開始遞增。
    b *main”在 main 函數的 prolog 代碼處設置斷點(prolog、epilog,分別表示編譯器在每個函數的開頭和結尾自行插入的代碼)
    info registers #查看所有寄存器變量
    info registers rax #查看寄存器rax的值
    p $rax #查看寄存器rax的值
    disassemble #查看匯編代碼
    set disassembly-flavor intel # 設置反匯編格式
    x/1uw $rbp-0x8 #查看某個內存地址里的值
    info proc mappings #查看進程地址空間中各塊內存的分配
    set follow-fork-mode child #調試子進程
    layout src #使用tui(Text User Interface),打開src和cmd兩個窗口
    layout split #使用tui,打開src,assemble,cmd三個窗口
    使用ctrl+x ctrl+a 或者 ctrl+x A 關閉tui
    使用ctrl+x o來切換active的窗口
    set environment varname [=value] 設置環境變量。如:set env USER=user
    部分引用自:http://laokaddk.blog.51cto.com/368606/945057 以及http://blog.csdn.net/kuike/article/details/2065999
    打印符號所處的源代碼位置:
    info line <function_name>
    python (lambda s: [print(i.symtab,":",i.line) for i in gdb.lookup_static_symbols(s)])("one")
    python (lambda s: print(s.symtab,":",s.line))(gdb.lookup_symbol("<variable_name>")[0])
    ============================================================================================
    如果有部分swap內存被使用了,而這個時候主存還有地方,可以把swap里的內容挪動到主存里,方法是:
    sudo swapoff -a && sudo swapon -a

     

    =============================================================================================

    在本機假設一個最簡單的http server的方法是:python -m SimpleHTTPServer &  #會偵聽本機的8000端口,服務目錄就是當前目錄
    用netstat查看tcp協議監聽的端口:netstat -nlpt
    用netstat查看udp協議監聽的端口:netstat -nlpu
    當然也可以用netstat -nlptu一并查看tcp和udp協議監聽的端口

    用netstat查看tcp的連接:netstat -anpt
    用netstat查看udp的連接:netstat -anpu
    當然也可以用netstat -anptu一并查看tcp和udp協議的連接

    探測一臺remote機器是否打開了某個端口,一般我們用telnet ip port,但這種方法不成功的時候并不能肯定這個端口就一定是closed,而且對于udp協議的端口,該方法也不奏效,正確的方法是:
    nc -z ip port && echo tcp port open || (nc -z ip port && echo udp port open || echo no tcp/udp port open)
    或許一些機器上沒有安裝nc,可以試試看是否安裝了netcat,這兩個工具是一樣的。
    再簡要說說netcat這個工具,這個工具很有用,從名字上就看得出來它的用途,我們知道cat是針對文件進行bytes流的in/out,而netcat是針對網絡端口進行bytes流的in/out。
    比如
    1。netcat -l -p 13001 > t3.3 &   #listening 0.0.0.0:13001,把收到的內容重定向到t3.3文件中,或許該命令需要修改為netcat -l 127.0.0.1 13001 > t3.3 &
    2。echo "hello world" | netcat 127.0.0.1 13001  #向127.0.0.1:13001端口灌入一定的bytes
    3。cat t3.3  #t3.3中的內容就是hello world
    網絡上有一篇介紹基于udp的ssh tunnel的文章,就是用到了netcat這個工具:http://zarb.org/~gc/html/udp-in-ssh-tunneling.html

    可以通過tcpdump來查看一個端口上收發的所有包:
    tcpdump -vv -n -i lo 'tcp port 10000'

    ===================================================================

    vi小技巧:

    先按q再按:,則會出現歷史命令

    使用sudo權限保存w !sudo tee %

    在命令模式下,Ctrl+w,然后再按q即可退出,ZZ也可以退出

    Ctrl+o是退回到上次編輯的位置

    Ctrl+g可以顯示當前編輯的文件名以及編輯的行數和列數

    %是匹配括號

    在~/.vimrc中輸入以下兩行可以實現再次打開文件時光標位置被保存:

    " 打開文件時,按照 viminfo 保存的上次關閉時的光標位置重新設置光標
    au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

    命令行Readline的快捷鍵:

    Ctrl+a/e:跳到行首/尾;Ctrl+u/k:刪除前/后面的內容;Ctrl+h/d:刪除前/后一個字符;Ctrl+b/f:移動前/后一個字符;Ctrl+p/n:查看前/后一條命令;Ctrl+Esc+r:恢復該行最初始的狀態;Ctrl+r/s:向前/后根據搜索詞在歷史命令中進行搜索(其實還有 Ctrl+s 是正向增量查找的,但是由于這個快捷鍵被終端預設成鎖屏幕了,沒有效果。不過可以使用命令 stty -ixon -ixoff來解除綁定,恢復可以用stty ixon ixoff<其此處的設置對應了Ctrl+s/q這組命令,即鎖定/解鎖屏幕,尤其用在屏幕上出現飛速的碼流的時候有效果>);Alt+b/f:向前/后移動一個單詞;Alt+Backspace/d:向前/后刪除一個單詞;要想了解更多這方面的快捷鍵可以使用bind -P

    syndaemon -d -i 4可以使得:當你輸入文字時,觸摸板失效4秒

    showkey -a可以顯示鍵盤上任意一個鍵的ascii碼值,Ctrl+v加Ctrl+<key>能顯示該鍵的鍵盤碼

    grep的-I選項(大寫的i)可以讓它不搜索binary文件,而-a選項是搜索所有文件,binary文件也會當成文本文件去搜索,此外還可以配合--exclude/include=GLOB來排除文件或者搜索特定文件,--exclude-dir=DIR可以排除一個或多個文件夾,-o選項只搜索出匹配的部分,比如你要在~目錄下搜索隱藏文件中的配置文件中的一些信息,可以這樣: grep <searchword> -RI --include=.*  --exclude-dir=.ies4linux .

    在所有命令中查找匹配的命令: ls ${PATH//:/\ /} | grep <searchword>

    有關對readline的控制,強烈推薦下面這兩篇文章:

    http://blog.chinaunix.net/u1/43271/showart_340284.html

    http://hi.baidu.com/riant/blog/item/aacf7cd9d0f91fe939012f88.html

    這里我對bind命令作一下說明,舉個例子好了,設定Ctrl+t是正向搜索歷史命令(相對于Ctrl+r反向搜索):如果臨時使用,那么bind '"\C-t": forward-search-history'即可;如果長久保存,那么首先在~/.bashrc中設定export INPUTRC=/etc/inputrc,然后編輯/etc/inputrc,增加一行:"\C-t": forward-search-history即可。我還在/etc/inputrc中設定了"C-xf": dump-functions和"C-xv": dump-variables以及"C-xm": dump-macros三行,分別用于打印出所有可以設置的函數、變量、以及宏。注意:每次你修改完/etc/inputrc文件后,需要Ctrl-x然后Ctrl-r才能使修改發揮作用。

    在X的終端里,Ctrl+Shift+up/down可以實現屏幕的上下滾動,一行一行的滾動;shift+pageup/pagedown實現一屏一屏的滾動

    ls的小技巧:

    alias ls='ls --color=tty'
    alias ll='ls -l --color=tty'
    alias l.='ls -a -d .* --color=tty'
    alias lD='ls -a -d --color=tty .*/; ls -d */ --color=tty'
    alias la='ls -A'

    strace -p <PID>可以看到該進程執行的系統調用,其實該命令會把一個進程先attach然后分析,最后再釋放。

    還是bind的使用,我們可以配置ctrl+m來選擇一個目錄下的文件,這個特性對于那些文件名字特別難輸入的文件或目錄特別有幫助,你可以設想一下當在字符終端上沒有鼠標,且沒安裝中文輸入法時,你想打開一個含有中文文件名的文件是多么困難,但是有了這個特性,你就可以自由選擇了。實施方法如下:

    編輯/etc/inputrc,找到類似這行的(沒有就添加):
    代碼:
    $if mode=emacs
    "\C-o": menu-complete

    或者在命令行直接使用bind '"\C-o":menu-complete'也可以。

    ================================

    mv foo.{jpeg,jpg}#這個命令將把foo.jpeg改名為foo.jpg。
    !! 是整條命令和所有參數
    !* 將代替上一個命令的所有參數
    !$ 上一條命令的最后一個參數
    !:3  上一條命令的第3個參數 

    ===========================================

    vi學習
    :r !command: 將命令command的輸出結果放到當前行
    :e filename: 打開文件filename進行編輯(會關閉當前文檔重新打開新文檔,可以使用Ctrl+O/I來切換)
    :n1,n2 d: 將 n1行到n2行之間的內容刪除
    :r filename: 將文件中的內容全部插入到當前位置

    Ctrl+a: 如果當前光標下的字符串中,從當前位置起能在后續連續的字符串中找到數字,那么按一次Ctrl+a就會使得該數字加1,比如abc23, 那么就會使得23變為24
    s: 刪除當前字符,并切換到插入模式,可以允許你輸入文本
    H: 光標移至屏幕頂行
    M: 光標移至屏幕中間行
    L: 光標移至屏幕最后行
    nz: 將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部,注意需要回車一下才生效。

    vi +n filename: 打開文件,并將光標置于第n行首
    ?pattern: 從光標開始處向文件首搜索pattern

    w或W : 光標右移一個字至字首
    b或B : 光標左移一個字至字首
    dw: 刪除右邊的一個字
    db: 刪除左邊的一個字

    browse vs/split: 用瀏覽窗口輔助你打開文件
    Ctrl+w,w  用于窗口間切換, 用Ctrl+w,Ctrl+w也可以, 這里主要考慮到了按鍵方便
    Ctrl+w,o  只保留當前窗口, 關閉其他窗口
    Ctrl+w,=  平均分配各個窗口
    Ctrl+w,數字<  在垂直切分窗口時,縮小當前窗口尺寸
    Ctrl+w,數字>  在垂直切分窗口時,放大當前窗口尺寸
    Ctrl+w,數字-  在水平切分窗口時,縮小當前窗口尺寸
    Ctrl+w,數字+  在水平切分窗口時,放大當前窗口尺寸
    Ctrl+w,c  關閉當前窗口
    Ctrl+w,s  將當前窗口橫著切割出另一個窗口, Ctrl+w,n也可以
    Ctrl+w,v  將當前窗口豎著切割出另一個窗口
    :split 文件名  用于在當前窗口中橫著切割出一個新的窗口, 并且將文件打開
    :vs 文件名  用于在當前窗口中豎著切割出一個新的窗口, 并且將文件打開

    mark標記: 新建一個標記用m, 后面可接數字或字母,  小寫字母僅能用于本文件中根據標記定位光標位置, 大寫字母可以實現文件之間的切換, 例如ma,m3,mA; 定位一個標記用單引號, 例如'a,'3,'A. 這里再舉個應用mark的例子, 在命令行模式下:'a,'b d用于刪除從'a到'b之間所有的行. 查看所有的mark的命令是:marks

    vi的寄存器: 用雙引號來建立, vim常用的寄存器有:
    ""     無名寄存器,包含最近刪除或抽出的文本
    "%     當前文件名
    "#     輪換文件名
    "*     剪貼板內容 (X11中表示 鼠標選擇的區域)
    "+     剪貼板內容
    "/     最近的搜索模式
    ":     最近的命令行
    ".     最近插入的文本
    "_     黑洞
    更為詳細的內容請參見http://blog.chinaunix.net/u/553/showart_361240.html和http://blog.chinaunix.net/u/9465/showart_448822.html
    調用寄存器時, 在普通模式可以用雙引號來調用, 如"a, 在插入模式下可以用Ctrl+r,a來調用寄存器a;對于用大寫字母表示的寄存器比如A, 代表向寄存器a中追加內容; 查看所有寄存器的內容用:reg
    "+y用于把vi中選中的部分復制到系統剪貼板上; "+yy用于把當前行復制到系統剪貼板上;"+p用于把系統剪貼板上的東西復制到當前位置

    查看所有對文件的改動用:changes

    vi使用ctags和taglist:
    在工程的頂層目錄下ctags -R
    vi –t main//可以打開所有定義了main函數的cpp文件
    :ts//會列出所有定義了main函數的位置, 你可以通過鍵入數字來選擇
    :tp//會在選擇下一個出現了main函數的cpp文件來顯示
    :tn//會在選擇上一個出現了main函數的cpp文件來顯示
    說明: 上面的ts,tp,tn都是針對vi -t main這個應用來談的, 其實它們也可以脫離這種場景去使用, 總之它們就是構建在ctags之上的, 用于搜索所有源文件中定義的變量或函數名之類的東西.

    WEB相對于web來說是長單詞移動命令,即只認識空格和換行
    {/}到上/下一段落
    [[/]]到上/下一個代碼塊{...}的開始處
    [{/]}到當前代碼塊{...}的{/}
    (/)移動到句首/尾
    S在當前行的任何一個位置運行該命令,可以把當前行的內容清空,然后移動到行首進入插入模式等待你輸入字符, 該命令等同于cc命令
    3S把當前的三行內容清空,并移動到行首且進入插入模式等待輸入
    s清空當前字符,并進入插入模式等你輸入字符
    10s清空當前的10個字符,并進入插入模式等你輸入字符,實際上對s和S的比較標準的翻譯是s多字符替換單字符,S整行替換
    .可以重復執行上一次的改變, 所謂改變指的是插入(i)或者刪除(d)或者替換(r)或者改變(c)的一次原子操作, 也就是不能將先刪除(d)3個字符再插入(i)5個字符這件事作為一個整體來對待, 如果想把這種情況用一次原子操作來完成, 你可以用c命令, 該命令會先直接把你想要改變的那個3個字符刪掉再允許你輸入5個字符作為替換
    qa開始錄制宏,并報存在寄存器a中,再次輸入q即可停止錄制宏,錄制宏的時候要注意在使用hjkl這些移動光標的命令時確保應用宏的時候不會有什么偏差,建議最好使用命令能定位光標,比如fFtT這樣的一行內的查找命令,有一篇文章舉的例子非常好:http://autodev.net/autodev/discuz/viewthread.php?tid=33
    :ab可以list出目前所有已經有的縮寫
    :ab hl hello world!可以用hl這個縮寫來代替hello world!,當你在insert模式下輸入hl后,再鍵入空格或者換行時就會發生上述的替換
    :unab hl撤銷hl這個縮寫
    d3w將刪除光標后 3 個單詞
    d2j將刪除當前行和下兩行
    :%s/regexp/replacement/gc可以讓你在替換之前確認一下
    <</>>將當前行向左/右縮進一次,縮進一次的大小取決于tabstop被設定的大小
    Ctrl+d/t在插入模式下向左/右縮進當前行
    ^移動到當前行的第一個非空白字符
    -/+移動到上/下一行的第一個非空白字符
    ]p粘貼的時候會考慮到縮進

    下面這個映射能夠使得在可視模式下選擇的文本,當你按下'/'鍵時由擴展可視范圍改為搜索選擇的文本

    :vmap / y/<C-R>"<CR>

    下面的鍵映射能夠使得在insert mode下移動光標:

    " 在插入模式下,移動光標
    imap <C-h> <C-o>h
    imap <C-j> <C-o>j
    imap <C-k> <C-o>k
    " to the left character, this way can go to the behind of last character
    imap <C-l> <ESC>la
    " to the begin of line
    imap <C-a> <ESC>0i
    " to the end of line
    imap <C-u> <ESC>A


    set list
    set listchars=tab:>-,trail:-
    highlight WhitespaceEOL ctermbg=magenta guibg=magenta
    match WhitespaceEOL /\s\+$\|\t/
    "highlight __SPACE ctermbg=yellow guibg=yellow
    "2match __SPACE / /

    ====================================
    ls -sSh
    ====================================
    發現驚天大秘密:呵呵,以前總覺得^A^B這些東西很奇怪,現在不覺得奇怪了,其實是有這樣一種邏輯在里面的:^A代表ascii碼為1的不可見字符,^B代表ascii碼為2的不可見字符,以此類推,因此我們最最熟悉的^M就代表ascii碼為13的字符了,也就是回車符號,而在linux的文本中都是使用換行符號作為行與行之間的分隔符的,因此^J就代表了換行符號,你可以用showkey -a來驗證我說的這些東西,但^這個符號要用ctrl鍵來代替,因此你要輸入ctrl+m才能看到效果。

    =============================
    top使用:
    f/o:選擇其他列;F/O:選擇要按之排序的列;R:反向排序;c:顯示完整的命令
    行;u:指定顯示某個用戶相關的信息;1:數字1顯示分開顯示多核 CPU;k:殺死
    某個PID;s:設置刷新的時間間隔;A:分四屏從不同角度顯示;G:從四種可供選
    擇的顯示組合中選定一種特定的顯示組合;B:加粗顯示 head里的數字信息;z:
    切換為紅黃顏色顯示;Z:選擇顏色顯示;</>:默認按照%CPU排序,選定的排序的
    列向左/右移動一列。
    ========================
    info的使用:
    b是到開頭,e是到結尾;到了某個結點回車是進入,u是返回上級;l(小寫的L)相當于后退;空格是向下翻頁,page up/down是向上/下翻頁;?是幫助;n和p分別是到下一個或上一個結點。
    ===========================
    screen使用:
    配置~/.screenrc為:

    altscreen on
    startup_message off
    defscrollback 100000
    #escape ^Xx
    backtick 1 0 0 sh -c 'echo $(ifconfig | grep Mask: | cut -d: -f2 | cut -d" " -f1 | grep -v 127.0.0.1; curl -s ifconfig.me)'
    backtick 2 60 60 sh -c 'uptime | sed -e "s/.*up *//" -e "s/,.*//"'
    #caption always "%{= wk} %{= KY} [%n]%t @ %H %{-} %= %{= KR} %l %{-} | %{= KG} %Y-%m-%d %{-} "
    ##hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %0c:%s "
    hardstatus alwayslastline "%{= KY} %-Lw%{= Bw}%n%f %t%{-}%+Lw %=@%H(%1`) %{=b KG}||%{-} %m/%d %0c %{=b KG}||%{-} up %2` %{=b KG}||%{-} %l"
    # mouse tracking allows to switch region focus by clicking, and you can't select texts by double-click texts if you open this flag
    # mousetrack on
    # get rid of silly xoff stuff
    bind s split
    # layouts
    layout autosave on
    # layout one region
    layout new one
    select 1
    # layout two region
    layout new two
    select 1
    split
    resize -v +8
    focus down
    select 4
    focus up
    # layout three region
    layout new three
    select 1
    split
    resize -v +7
    focus down
    select 3
    split -v
    resize -h +10
    focus right
    select 4
    focus up
    layout attach one
    layout select one
    # navigating regions with Ctrl-arrows
    bindkey "^[[1;5D" focus left
    bindkey "^[[1;5C" focus right
    bindkey "^[[1;5A" focus up
    bindkey "^[[1;5B" focus down
    # switch windows with F3 (prev) and F4 (next)
    bindkey "^[OR" prev
    bindkey "^[OS" next
    # switch layouts with Ctrl+F3 (prev layout) and Ctrl+F4 (next)
    bindkey "^[[1;5R" layout prev
    bindkey "^[[1;5S" layout next
    # F2 puts Screen into resize mode. Resize regions using hjkl keys.
    bindkey "^[OQ" eval "command -c rsz" # enter resize mode
    # use hjkl keys to resize regions
    bind -c rsz h eval "resize -h -5" "command -c rsz"
    bind -c rsz j eval "resize -v -5" "command -c rsz"
    bind -c rsz k eval "resize -v +5" "command -c rsz"
    bind -c rsz l eval "resize -h +5" "command -c rsz"
    # quickly switch between regions using tab and arrows
    bind -c rsz \t    eval "focus"       "command -c rsz" # Tab
    bind -c rsz -k kl eval "focus left"  "command -c rsz" # Left
    bind -c rsz -k kr eval "focus right" "command -c rsz" # Right
    bind -c rsz -k ku eval "focus up"    "command -c rsz" # Up
    bind -c rsz -k kd eval "focus down"  "command -c rsz" # Down

    使用時,新建一個tab是ctrl+a,c;退出一個tab是ctrl+d(其實就是正常退出即可,當然你也可以使用screen為你提供的ctrl+a,k來實現);退出所有的tab是ctrl+a,:quit或者是ctrl+a,ctrl+\也可以; 想退出screen干點別的事,但是卻不終止screen里面的進程,這叫detach,用ctrl+a,d可以實現,下次再想進入那個screen的時候,需要screen -ls一下看看當前都有那些screen, 然后screen -r <名字>來進入你想進入的screen, 當然你也可以在啟動screen的時候這么干: screen -S hello,當你detach screen之后想再次進入,那就screen -r hello即可.
    ctrl+a,': select a tab;
    ctrl+a,": open window manager to select a tab;

    Ctrl+a S split terminal horizontally into regions Ctrl+a c to create new window there
    Ctrl+a | split terminal vertically into regions Requires debian/ubuntu patched screen 4.0
    Ctrl+a :resize resize region  
    Ctrl+a :fit fit screen size to new terminal size Ctrl+a F is the same. Do after resizing xterm
    Ctrl+a :remove remove region Ctrl+a X is the same
    Ctrl+a tab Move to next region

    admin login
    screen -S class1
    Ctrl-a :multiuser on
    Ctrl-a :acladd lili

    lili login
    screen -x admin/session
    Ctrl-a :aclchg lili -w "#"

    Ctrl-a :wall message

    For detail info, plz refer to: http://www.linux.com/archive/feed/56443
    如果screen的sock文件被刪了(默認是在/tmp/下),導致無法attach,可以重建sock文件,方法是kill -CHLD 30860 #30860為screen進程的pid
    ===============================
    對于sudo這個命令,修改配置文件/etc/sudoers時直接用visudo就可以了,連文件名都省略了,而且還可以幫助你檢查格式,關于怎么寫配置文件的內容,請使用man sudoers,在幫助的最后部分給出了大量的實例,足夠你使用了,如果覺得看英文不爽,網上有很多這份man sudoers的中文版,比如http://www.fengnet.com/showart.asp?art_id=587&cat_id=10 我來總結一下,其實定義的格式就是who hosts = (可以偽裝成的用戶) [NOPASSWD:] commands
    ==============================
    對于sort命令, 最復雜的莫過于對POS1和POS2的設定了, 先給出結構:
    -k POS1,POS2 -k POS3,POS4, 例如sort -t : -n -k 5b,5b -k 3,3 /etc/passwd
    多個-k可以指定多個排序的鍵, 通常我們很少使得排序的鍵是跨越field的, 因此通常你會看到像上面那個例子里描述的那樣, 兩個5, 兩個3
    下面就來說一下POS的規則, 分為新標準和舊標準, 新標準:F[.C][Mbdfinr], 詳細說明如下:
    F是數字,代表第幾個Field;
    C是數字,代表Field內部的第幾個字符;
    Mbdfinr代表選項, 與sort -[Mbdfinr]一樣, 只不過前者只對當前POS有效, 后者對所有有效, 不過前者的優先級高于后者, 此處還有一點要說明: 因為一個-k會指定兩個POS,只要有一個POS中指定了Mbdfinr即可, 兩個都指定同一個也行
    再說說舊標準: +POS1 -POS2
    POS的規則和前面一樣, 但舊標準就只能指定一個key了, 不能像-k那樣可以搞出多個來; 而且在舊標準中的Field采用的是間隔的方式, 如果你期望按照第一個key來排序,那么就得使用+0 -1來實現, 而在新標準中是采用 -k 1,1
    ==================================
    簡要說說lsof最常用的幾種方法:
    lsof 文件 ==>查看文件被那些進程占用
    lsof -c bash ==>查看被進程名以bash開頭的進程占用的文件
    lsof -u root ==>查看root用戶使用到的文件
    lsof -p 2343 ==>查看被進程2343打開的文件
    lsof 目錄名 ==>查看目錄下打開的文件, 不遞歸, 深度為1
    lsof +D 目錄名 ==>查看目錄下打開的文件, 遞歸
    lsof -i ==>顯示所有端口建立的連接
    lsof -i :80 ==>顯示所有打開80端口的連接
    lsof -d 4==> 顯示fd為4的進程
    lsof -a -d4 -p $$ ==>這里的選項a表示將對d選項和p選項的結果的AND操作
    ========================
    關閉筆記本的屏幕的方法: xset dpms force off
    ================================
    vim 提供 6中折疊方式
              manual           手工定義折疊(默認,常用)
              indent             更多的縮進表示更高級別的折疊(常用)
              expr                用表達式來定義折疊
              syntax             用語法高亮來定義折疊(常用)
              diff                  對沒有更改的文本進行折疊
              marker            對文中的標志折疊

    set fdm=indent
    如果使用了indent方式,vim會自動的對大括號的中間部分進行折疊,我們可以直接使用這些現成的折疊成果。
    indent 對應的折疊代碼有:
    zc      折疊
    zC     對所在范圍內所有嵌套的折疊點進行折疊
    zo      展開折疊
    zO     對所在范圍內所有嵌套的折疊點展開
    [z       到當前打開的折疊的開始處。
    ]z       到當前打開的折疊的末尾處。
    zj       向下移動。到達下一個折疊的開始處。關閉的折疊也被計入。
    zk      向上移動到前一折疊的結束處。關閉的折疊也被計入。

    set fdm=manual
    可以使用下面的命令來創建和刪除折疊:
    zf      創建折疊,比如在marker方式下:
                       zf56G,創建從當前行起到56行的代碼折疊;
                       10zf或10zf+或zf10↓,創建從當前行起到后10行的代碼折疊。
                       10zf-或zf10↑,創建從當前行起到之前10行的代碼折疊。
                       在括號處zf%,創建從當前行起到對應的匹配的括號上去((),{},[],<>等)。
    zd      刪除 (delete) 在光標下的折疊。僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
    zD     循環刪除 (Delete) 光標下的折疊,即嵌套刪除折疊。
              僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
    zE     除去 (Eliminate) 窗口里“所有”的折疊。
              僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
           因此,對于fdm=indent之后,如果想消除通篇的折疊,簡單方法就是set fdm=manual,然后zE
    可以通過下面兩個來控制通篇折疊的啟停:
    :set nofoldenable
    :set foldenable

    ===============================================================
    vim的幫助很詳細,但若不了解有時的確不知道應該如何輸入關鍵詞,所以總結一下:
    -----------------------------------------------------------------------------
    條目                                      前綴                       例子
    -----------------------------------------------------------------------------
    Normal模式命令                    無                          :h k
    CTRL控制字符                       CTRL-                     :h CTRL-r
    Visual視圖模式                      v                            :h v_u
    Insert插入模式命令                i                             :h i_CTRL-o
    ex-模式命令                           :                            :h :set                                                                                         
    Command-line命令行編輯     c                            :h c_<BS>
    命令參數                                -                            :h -m
    選項                                      '                             :h 'winminwidth'
    ------------------------------------------------------------------------------
    哦,還有一些關鍵詞是用尖括號<>括起來的,如
    :h <Left>
    :h <CR>
    :h <Up>
    :helpg[rep] {pattern}  搜索所有的幫助文本并給出一個匹配 {pattern} 行的列表, 用:cw打開quickfix窗口看到所有的匹配位置, :cn/p用于向后/前翻看

    另外,在輸入關鍵詞的時候,可以按Tab鍵補全,ctrl-d列出與光標前面的關鍵詞所匹配的名字,ctrl-a列出全部模式
    =======================================
    在安裝了vim的插件之后,雖然幫助文檔已經放到doc目錄下了,但是還是需要調用vim的一個命令才能讓help找到,該命令是::helptags ~/.vim/doc
    =======================================
     vim里面的tab:
    vim *.cpp -p //用多個tab打開多個文件
    在normal模式下:
      gt //切換到下一個tab
      gT //切換到上一個tab
      Ctrl-w T //把當前的window放到一個新的tab中打開
    在command模式下:
      :tabnew [filename] //打開一個新的tab
      :tabn //切換到下一個tab
      :tabp //切換到上一個tab
      :tabs //list出當前所有的tab

    vim里面的gf:
    在noraml模式下:
      gf //打開鼠標下的文件
      gF //打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
      Ctrl+w f //水平切分出一個新的窗口,里面打開鼠標下的文件
      Ctrl+w F //水平切分出一個新的窗口,里面打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
      Ctrl+w gf //打開一個新的tab,里面打開鼠標下的文件
      Ctrl+w gF //打開一個新的tab,里面打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
    gf, gF, Ctrl+w gf, Ctrl+w gF均支持在visual模式下,只處理visual部分對應的文件
    ======================================================================
    gcc/g++步驟拆解:
    gcc -E hello.c -o hello.i//使用cpp命令
    gcc -S hello.i -o hello.s//使用cc1命令
    gcc -c hello.s -o hello.o//使用as命令
    gcc hello.o -o hello//使用ld命令
    注意事項:
    1. 這些步驟是對文件名的后綴有要求的,例如-E產生hello.E,然后在-S步驟是不行的;
    2. 用g++可以對cpp文件做同樣的步驟;
    gcc 參數:
    -S: 生成匯編文件
    -E: 輸出預編譯結果 或者 用cpp t.cpp也行; 基本上g++ -E就等于cpp
    -H: 編譯并打印出引用的頭文件
    -E -dD: 預編譯, 并且將用到的宏擴展都給列了出來
    -###: 打印出編譯gcc時用到的參數
    # 與宏有關的
    gcc -dM -E - <<< '' -o a.E #查看gcc builtin的宏
    gcc -dM -E a.cpp -o a.dM #查看所有相關的宏定義
    gcc -dD -E a.cpp -o a.dD #查看所有相關的宏定義,并且指明出處
    gcc -E a.cpp -o a.E #查看宏替換完成,預編譯后的結果
    # 與頭文件有關的
    gcc -H a.cpp -o a.H #查看所有依賴的頭文件,而且引用關系通過行前綴.的多少能夠體現出來
    gcc -M a.cpp -o a.M #查看所有依賴的文件
    gcc -MM a.cpp -o a.MM #查看所有依賴的文件,但不包括系統頭文件
    gcc -MM -MP -MD -MF a.dep a.cpp -c -o a.o #正常編譯,但同時產出一個附屬品a.dep用于描述編譯a.cpp所有依賴的東西,a.dep可用于Makefile檢測a.cpp依賴是否有變化,這會比我們通常寫的a.o: a.cpp這種要強大的多;-MD是為了讓編譯繼續(-E會導致停在預編譯階段,-M/-MM/-MP等都會暗含-E參數,加上-MD則會又把-E給省略掉);-MP是為了讓a.dep里除了a.cpp的所有依賴之外,還能有每一個依賴的phony target;-MF是用于指定附屬品的文件名,如果沒有這個參數,默認會使用a.d(a.d的由來是根據-o a.o得來的,如果是-o XXX.o,那么就是XXX.d)
    生成靜態庫用ar crs libtest.a *.o;還可以生成thin archive,用ar crsT libtest.a *.o. thin archive只是存了真正的.o的位置,因此體積很小,而且ar crsT libtest.a libanother.a會把libanother.a中的.o的位置提取出來放到libtest.a中,對于local build,thin archive非常棒。
    對于從靜態庫生成動態庫,標準的方法是ar x libtest.a(注意thin archive是不能ar x的,這里的libtest.a是普通的archive),然后再g++ -shared -o libtest.so *.o,但也可以直接用.a來生成.so,如果是普通archive,需要用-Wl,--whole-archive libtest.a -Wl,--no-whole-archive -lpthread -ld(這種方法,當多個.a中含有相同符號時,會出現沖突,因為該方式會把.a中的所有符號都鏈接進來);除了可以用--whole-archive方法,還可以用-Wl,--start-group *.a -Wl,--end-group,這種方法會解決repeated查找中間那些.a文件中的符號,可以解決交叉依賴的問題,但要注意的是位于--start-group和--end-group之間的那些.a,它們只是被用于從中抽取必須的symbol,至于哪些symbol需要被用到,這個是由為生成.so所顯示指定的.o來決定的,如果不指定任何.o,僅僅用一大堆.a,那么生成的.so中不會有任何有用的symbol,例如g++ -shared -o libt28.so -Wl,--start-group libt28_1.a libt28_2.a libdict.a -Wl,--end-group產生的libt28.so中就不會含有libt28_1.a libt28_2.a libdict.a中的任何symbol;但如果是g++ -shared -o libt28.so -Wl,--start-group libt28_1.a libt28_2.a libdict.a test.o -Wl,--end-group,那么會根據test.o中哪些symbol需要從libt28_1.a libt28_2.a libdict.a中得到來決定哪些symbol進入最終的libt28.so。雖然.a的本質就是.o的集合,但ld對待.a和.o是很不一樣的。ld還有一個鏈接選項是-u,可以顯示讓某個symbol變為undified。
    ==========================================
    清除log中的顏色控制字符:sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
    ================================
    more或less里面,默認搜索的時候是大小寫*不敏感*的, 要想改為*敏感*的, 直接在正常狀態下鍵入-i即可, 再次鍵入-i即可切換到*不敏感*; 在vi里面默認搜索是大小寫*敏感*的, 可以在搜索的時候通過添加\c的suffix改為*不敏感*, 例如輸入/abc\c
    =========================================
    svn merge -r 854:853 test.cpp
    svn diff --summarize -r 853:854
    svn pg svn:externals .
    svn ps svn:externals 'seg_tc https://bj-scm.tencent.com/search/search_discuz_rep/discuz_code_proj/trunk/rela_content/encode3.0/seg_tc' .
    svn ps svn:externals -F svn.externals .
    =========================================
    awk中的map真的很好使,此前沒用到這個東西,以后要多加利用了,哈哈。
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    =========================================
    ps -eo pid,ppid,lstart,etime,cmd  | grep XXX #lstart代表進程開始執行的時間,etime是進程運行到現在歷時多久
    ps -ef 可以看到ppid
    =========================================
    grep -P 'a\tb'
    grep "a"$'\t'"b"
    grep 'a    b' #tab鍵的輸入方法是Ctrl+v,然后按tab鍵
    =============================================
    find -size +1000c -size -2000c #查找文件大小在(1000,2000)之間的文件
    find -size 1000c #查找文件大小正好等于1000的文件
    find -mmin -1 #查找近1分鐘之內修改過的文件
    find -amin -1 #查找近1分鐘之內訪問過的文件
    find -empty #查找空文件或空目錄

    ==============================================

    cat input_file | python -c "import zlib,sys;print zlib.compress(sys.stdin.read())" #用于壓縮,當然改為uncompress就可用于解壓縮

    ==================================================

    1. 查看內核版本命令:
    cat /proc/version
    uname -a
    2. 查看Linux版本:
    lsb_release -a
    cat /etc/issue
    cat /etc/*release*
    =====================================================
    vim下的cursorline和cursorcolumn
    set   cursorline
    highlight CursorLine ctermbg=lightmagenta term=bold cterm=bold
    "set   cursorcolumn                                                                                                                                                                                                                            
    "set   startofline! "當cursorcolumn激活時,當ctrl+f/b翻頁時,光標會跑,取消了這個選項后,光標就不跑了
    highlight CursorColumn ctermbg=lightmagenta term=bold cterm=bold

    ==================================================================
    在vi中執行命令處理當前文檔的內容

    :! ls #執行一下ls命令
    :.! for i in {1..100}; do echo $i; done #.代表當前行,即把當前行的內容輸入給!后面的命令,!后面的命令用處理后的結果替換當前行
    :%!sort | uniq -c #%代表所有行,即把所有行的內容作為input給sort | uniq -c,輸出的結果再替換原有的所有行的內容
    :23,28!grep ok #把23行到28行之間的內容輸入給grep ok命令,用處理后的結果替換23行到28行之間的內容
    :%! sudo tee % #第一個%代表該文檔的所有行,第2個%代表當前的文件名,這個命令相當于cat current_file | sudo tee current_file,其實就是相當于用sudo權限重新把當前內容寫到文檔里,這對于我們忘記了用sudo vi current_file的人來說是多么美妙的一件事情啊

     ==============================================

    nm -C //demangle symbol
    nm -D -C //just dynamic symbol, 該選項用于查看so文件中的可以導出的符號,即便so被strip也沒問題
    nm -l -C //print line number

    ==========================================

    編譯時,第一步一般都是./configure
    這個shell腳本里面是通過pkg-config工具來辨認依賴的包是否已經安裝,configure過程的日志記錄在config.log文件中,如果configure失敗,可以查看該文件來進行診斷
    ./configure --help | grep '\(dis\|en\)able' #查看可以配置的features
    pkg-config工具會讀取/usr/share/pkgconfig/目錄下的*.pc文件,*.pc文件中記錄了編譯包時的CFlags以及這個包在當前機器里的includedir和libdir等信息。有時候通過dpkg -l會發現包已經安裝,但卻沒有包對應的pc文件,這個時候需要安裝該包的dev版。
    可以通過apt-file search XXX.pc來找到包含該文件的安裝包。
    如果某些時候無法通過apt-get install來安裝dev版的包,可以下載一個源碼包,然后./configure && make, make -n install可以查看都哪些文件要install,確認之后make install,默認是安裝到/usr/local/XXX/下面,這時可以cp /usr/local/XXX/lib/pkgconfig/XXX.pc /usr/share/pkgconfig/下,然后安裝;更好的方法是mkdir here_installation; ./configure --prefix=$PWD/here_installation; make; make install;然后export PKG_CONFIG_PATH=/home/admin/zbar-0.10+doc/ImageMagick-6.8.6-8/here_installation/lib/pkgconfig/,然后再編譯zbar-0.10+doc即可找到需要的pc文件了。
    cmake也是通過pkg-config來檢測包的安裝情況的,它的配置文件是CMakeLists.txt。
    下面這種編譯方式可以編譯出來debug版本的,而且只有靜態庫:
    ./configure --prefix=$PWD/here_installation --disable-shared CFLAGS="-g -O0" CPPFLAGS="-g -O0" CXXFLAGS="-g -O0"
    ======================================================
    如果ssh連接很慢,可以用ssh -v來看一下debug信息,試試配置一下/etc/ssh/ssh_config文件里的GSSAPIAuthentication no選項。
    ======================================================
    sort -R file 或者shuf file可以random打亂文件順序,可以設置一個random的seed通過--random-source=FILE
    ======================================================
    通過gzip壓縮得到的*.gz文件和通過zlib庫壓縮出來的東西不一樣,前者通過zcat或者gunzip可以解壓縮,后者必須通過zlib庫來解壓縮,沒有現成的工具,不過可以使用cat XXX | python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))"
    =======================================================

     

    wget -e http-proxy=proxy.satwe.com:8080 --proxy=on --proxy-user=hamo --proxy-passwd=8888 -c http://www.satwe.com
    =======================================================

     

    ssh-copy-id user@host

     

    man less | col -b > less.txt #這個命令可以讓你把man文件轉成純文本文件
    PAGER=cat man less > less.txt #這個命令可以讓你把man文件轉成純文本文件
    vim scp://username@host//path/to/somefile #vim一個遠程文件
    curl ifconfig.me #當你的機器在內網的時候,可以通過這個命令查看外網的IP
    wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com #下載整個www.example.com網站
    screen -d -m -S some_name ping my_router #后臺運行一段不終止的程序,并可以隨時查看它的狀態。-d -m參數啟動“分離”模式,-S指定了一個session的標識。可以通過-R命令來重新“掛載”一個標識的session。更多細節請參考screen用法 man screen
    ssh user@host cat /path/to/remotefile | diff /path/to/localfile - #比較一個遠程文件和一個本地文件
    ssh user@server bash < /path/to/local/script.sh #在遠程機器上運行一段腳本。這條命令最大的好處就是不用把腳本拷到遠程機器上
    man ascii #顯示ascii碼表
    mtr coolshell.cn #mtr命令比traceroute要好
    echo "ls -l" | at midnight #在某個時間運行某個命令
    curl -u username -s "https://mail.google.com/mail/feed/atom" | perl -ne 'print "\t" if /<name>/; print "$2\n" if /<(title|name)>(.*)<\/\1>/;' #檢查你的gmail未讀郵件
    tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR="1;32" grep --color "[^ ]" #想看看Marix的屏幕效果嗎?
    echo 123456 | dd cbs=2 conv=unblock #把一行內的字符按照固定寬度切分為多行
    ls | xargs -P 5 -i echo "This is:{}" #并行度為5來執行命令

    ======================================================================

    搭建web-based ssh terminal
    參考:http://en.wikipedia.org/wiki/Web-based_SSH
    下載https://code.google.com/p/shellinabox/,運行:sudo ./shellinaboxd -t -b -q --css=shellinabox/white-on-black.css
    =======================================================================
    jar的使用:
    jar tvf XX.jar;
    jar xvf XX.jar;
    jar cvf XX.jar a.class;
    javac的使用:
    javac -classpath /home/admin/a/b.jar:a/b/c.jar a.java
    使用jode把*.class文件反編譯成*.java文件:
    下載地址:http://jode.sourceforge.net/download.php
    jar xvf jode-1.1.2-pre1.jar
    java jode.decompiler.Main a.jar
    java的使用:
    java -h
    Usage: java [-options] class [args...]
               (to execute a class)
       or  java [-options] -jar jarfile [args...]
               (to execute a jar file)
    java jode.decompiler.Main a.jar #如果jode-1.1.2-pre1.jar里的META-INF/MANIFEST.MF文件里是這么寫的Main-Class: jode.decompiler.Main,那么也可以用java -jar jode-1.1.2-pre1.jar a.jar
    java -jar a.jar arg1 arg2 arg3
    =========================================================
    如果聲音異常,重啟聲卡:
    sudo alsa force-reload
    ===========================================================
    sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
    sudo apt-get update
    sudo apt-get install l2tp-ipsec-vpn

     

    ===========================================================
    man -l XXX.1 可以對指定文件用man
    ===========================================================
    今天觸發了一個bug,當只有.a文件時,下面兩種編譯是不一樣的:
    g++ -o WpuServer -Ithrift-0.9.0/here_installation/include/ -Iboost_1_53_0  -I../gen-cpp -Lthrift-0.9.0/here_installation/lib/ -pthread -lrt WpuServer.cpp ../gen-cpp/WorkitemProcessUnit.cpp ../gen-cpp/wpu_types.cpp ../gen-cpp/wpu_constants.cpp -lthrift #ld ok
    g++ -o WpuServer -Ithrift-0.9.0/here_installation/include/ -Iboost_1_53_0  -I../gen-cpp -Lthrift-0.9.0/here_installation/lib/ -pthread -lrt -lthrift WpuServer.cpp ../gen-cpp/WorkitemProcessUnit.cpp ../gen-cpp/wpu_types.cpp ../gen-cpp/wpu_constants.cpp #ld error
    ===========================================================
    hadoop fs -cat /home/mr/hadoop/tmp/mapred/system/job_201306051048_50459/job.jar | jar x #用于拿到任務相關的所有信息,包括map/reduce相關的程序和配置以及數據文件
    ===========================================================
    perl -e "alarm 2; exec @ARGV" "sleep 3; echo 35" #設置超時來運行命令
    ===========================================================
    cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' #替代shuf命令
    ===========================================================
    tac #按照行reverse
    rev #行內按照字符reverse
    diff #按照行進行diff
    cmp #按照字符進行diff
    > test.txt echo "hello world!" #輸出到test.txt文件中
    < test.txt cat #從text.txt文件中讀取內容
    cat <(echo "abcd") #cat讀的是一個文件
    cat < <(echo "abcd") #cat讀的是stdin
    cat <<<"abcd" #cat讀的是stdin
    cat <<{{
    abcd
    {{ #cat讀的是stdin
    cat <<{{ test.txt
    abcd
    {{ #cat讀的是stdin和test.txt文件
    cmp -bl <(echo "abcde") <(echo "abCdE") #比較兩個等長的字符串,并打印出不同的字符
    =============================================================
    echo a我bc' | grep -P "[\x20-\x7F]"
    grep -o -P '(?<=<text><!\[CDATA\[).*?(?=\]\]></text>)'
    regex有BRE(Basic Regular Expression),ERE(Extended Regular Expression),PCRE(Perl Compatible Regular Expression)三種,GNU的BRE和ERE是一樣的,PCRE支持正反向預查以及非貪婪模式,上面那個正則用于從xml中找出<text>...</text>之間的文字,注意.*?,這里的?是表示非貪婪匹配,即盡可能短的去匹配。

    ==============================================================

    $ printf "\xe6\x88\x91\xe4\xbb\xac\n" 
    我們
    $ printf "%'d\n" 23423423423
    23,423,423,423
    < t1.cpp tee >(column -t > t3.3) >(cat -n > t3.4) >/dev/null
    paste -d'@' t3.3 t3.4
    $ echo {1..8} | sed 's/ /\n/' | xargs -n 2
    1 2
    3 4
    5 6
    7 8
    $ echo {1..8} | sed 's/ /\n/g' | xargs -L 2
    1 2
    3 4
    5 6
    7 8
    =============================================================
    screen usage:
    {Ctrl+a x} lock screen
    {Ctrl+a "} select window from list
    {Ctrl+a X} remove one region that is generated by {Ctrl+a S} or {Ctrl+a |}
    {Ctrl+a [} or {Ctrl+a Esc} enter copy mode,
    After enter copy mode, how to mark characters and copy them:
    1. copy one line, Y;
    2. copy one word, W;
    3. copy a range from specific pos in one line: <space> firstly, move cursor, <space> secondly;
    4. copy multiple lines: y, move cursor, <space>;
    {Ctrl+a ]} or {Esc} exit copy mode
    {Ctrl+a >} write paste buffer to file(/tmp/screen-exchange)
    {Ctrl+a <} read from file(/tmp/screen-exchange) into paste buffer
    {Ctrl+a ]} paste buffer into current cmdline

    ================================================================

    如何更改一個已經運行的程序的輸入輸出
    gdb attach 1323
    (gdb) call creat("/tmp/myprog.stdout",0600)
    $1 = 7
    (gdb) call dup2(7,1)
    $2 = 1
    (gdb) call creat("/tmp/myprog.stderr",0600)
    $3 = 8
    (gdb) call dup2(8,2)
    $4 = 2 

     ================
    useradd或usermod添加當前用戶到某個group之后,通過id命令發現自身仍然不在那個group里,可以用如下命令:newgrp - new_group_name
    =============

    解決`locale -a`發現en_US.UTF-8缺失的問題:localedef -i en_US -f UTF-8 en_US.UTF-8
    =============

     

    所有man文件里搜索:
    man -wK FIFO
    man -wK --regex 'call.*main'

    posted on 2009-06-13 11:14 so true 閱讀(2106) 評論(0)  編輯  收藏 所屬分類: Linux

    主站蜘蛛池模板: 国产亚洲AV手机在线观看| xxxxwww免费| 激情97综合亚洲色婷婷五| 羞羞漫画登录页面免费| 国产一区二区三区免费在线观看| 亚洲一区二区三区在线观看网站| 成人一a毛片免费视频| 亚洲精品动漫免费二区| 日本二区免费一片黄2019| 欧美色欧美亚洲另类二区| 亚洲AV日韩精品一区二区三区| 黄色免费网址在线观看| 国产成人精品亚洲精品| 暖暖免费日本在线中文| 亚洲色欲www综合网| 妻子5免费完整高清电视| 亚洲精品无码专区在线| 免费成人在线观看| 男女一边桶一边摸一边脱视频免费| 亚洲色偷偷偷鲁综合| 久久久久免费看成人影片| 亚洲成a人片在线观看播放| 最近最新中文字幕完整版免费高清 | 国产在线观看片a免费观看| 亚洲欧美aⅴ在线资源| 亚洲av成人一区二区三区在线观看| a毛片在线看片免费| 91亚洲性爱在线视频| 国产精品视_精品国产免费| 一级有奶水毛片免费看| 亚洲国产二区三区久久| 成人午夜免费福利| www成人免费视频| 精品亚洲成a人片在线观看少妇| 在线v片免费观看视频| 一边摸一边爽一边叫床免费视频| 亚洲一区二区三区夜色| 国产成人免费片在线观看| 伊人久久大香线蕉免费视频| 亚洲成人激情小说| 亚洲伊人色欲综合网|