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

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

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

    so true

    心懷未來,開創(chuàng)未來!
    隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
    數(shù)據(jù)加載中……

    bash redirect re-study

    本質(zhì):先理解linux里的int dup2(int oldfd, int newfd)命令,dup2() makes newfd be the copy of oldfd。
    理解:重定向這個概念其實不是很好理解,如果用編程里面的指針來說明,那就很容易了。舉個例子,比如指針p1指向瓶子,指針p2指向抽屜,現(xiàn)在執(zhí)行p1>&p2(相當(dāng)于p1 = p2),這樣p1這個指針也指向抽屜了,也就是說我們把p1這個指針重定向到一個新的地方,這個地方是p2所指的地方,即抽屜;
        簡而言之,這個例子里重定向的含義是:把p1指向p2所指的地方(重定向就是指向的含義),而瓶子、抽屜這2個“實體”是不變的,重定向能調(diào)整的只是指針的指向。
        $ ls -l /proc/$$/fd
        lr-x------ 1 admin admin 64 2016-03-30 10:14 0 -> /dev/pts/413
        lrwx------ 1 admin admin 64 2016-03-30 10:14 1 -> /dev/pts/413
        lrwx------ 1 admin admin 64 2016-03-30 10:14 2 -> /dev/pts/413
        lrwx------ 1 admin admin 64 2016-03-30 10:14 255 -> /dev/pts/413
        我們說0代表stdin,1代表stdout,2代表stderr,這里stdin/stdout/stderr是實體(這里都是/dev/pts/413,即terminal這個設(shè)備),0/1/2只是一個fd,可以理解為指針或者標(biāo)記;
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 2>&1 >file1之所以file1里只會有1行,原因是:
        我們首先把2指向了stdout(stdout正是1所指的東西),這個時候1和2都指向了stdout;
        然后我們把1指向了file1,這個時候2依然還是指著stdout;
        然后I'm from stdout這句話寫到了1里面,其實也就是寫到了file1里面,I'm from stderr這句話寫到了2里面,其實也就是寫到了stdout里面。
    整體規(guī)則:
        1. TO (<|>|<>) FROM;
        2. (<|>)這兩個東西后面可以跟&fd/&-/&fd-,也可以跟一個file名字;例外>&file1表示stdout和stderr都重定向到file1里面;<>后面只可以跟file1,例如<>file1表示從file1里既讀入數(shù)據(jù),也寫入數(shù)據(jù);
        3. (<|>|<>)這三個東西前面不能有空格,后面跟的&不能有空格,除此之外無要求,例如:exec 1>& 2- #但2和-之間不能有空格;
    操作:
        1. 打開一個fd的方法:exec fd>&1  或者   exec fd<&0 或者 exec fd>file1 或者 exec fd<file1 或者 exec fd <>file1;
           如果你不想指定fd(希望系統(tǒng)自動給你分配一個fd),那么有一種特殊的用法,例子是:
             exec {NEW_STDOUT}>&1 #注意這個用法很特殊,你不能NEW_STDOUT=15; exec ${NEW_STDOUT}>&1
             echo "hello" >&$NEW_STDOUT # echo "hello" >&${NEW_STDOUT}也可以
             echo ${NEW_STDOUT} #從10開始分配
             exec {NEW_STDOUT}>&-
        2. 關(guān)閉一個fd的方法:exec fd>&- 或者 exec fd<&-
        3. move fd的方法:new_fd>&old_fd-,move完之后,old_fd會被關(guān)掉;
    實戰(zhàn):
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 2>&1 >file1 #file1里將會有1行I'm from stdout,原因是stdout賦給了stderr,file1賦給了stdout,2句話里,打印到stdout的那句被寫入file1,打印到stderr被寫入到了stdout
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) >file1 2>&1 #file1里將會有2行,原因是file1賦給了stdout,stdout賦給了stderr(其實也就是file1賦給了stderr),這個時候,stdout和stderr都指向了file1
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) &> file1 #file1里將會有2行,file1前面的空格可以省略
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) >& file1 #file1里將會有2行,file1前面的空格可以省略
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) |& cat > file1 #file1里將會有2行,file1前面的空格可以省略
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 2>&1 | cat > file1 #file1里將會有2行,file1前面的空格可以省略
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) >file1 | grep err #grep fail
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 2>&1 >file1 | grep err #grep ok
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 3>&1 1>&2 2>&3-| grep stderr #grep ok,這其實實現(xiàn)了stdout和stderr的交換,類似于通過c=a;a=b;b=c;來實現(xiàn)a和b的交換(先把a(bǔ)賦給c,緊接著找到b賦給a,然后用c再賦給b)
        (echo "I'm from stdout"; echo "I'm from stderr" 1>&2) 1>&2- | grep stderr #grep ok
        echo "hello world" | tee >(grep hello) >(grep world) >/dev/null #結(jié)合上tee的多路dispatch,功能會更強(qiáng)大
        > file1 #create file1 or truncate file1 to zero size
        <file1 cat #<file1這部分放到命令的前面或者后面都可以
        2>&1 ls not_found_file | grep found #grep ok
        cat < file1 > file2 #等同于cp file1 file2
    <>高級用法:
        1. 寫到一個文件中指定的地方:
            echo 1234567890 > file1   # 寫字符串到"File".
            exec 3<> file1            # 打開"File"并且給它分配fd 3.
            read -n 4 <&3             # 只讀4個字符.
            echo -n . >&3             # 寫一個小數(shù)點.
            exec 3>&-                 # 關(guān)閉fd 3.
            cat file1                 # ==> 1234.67890
        2. 用bash下載網(wǎng)頁
            $ exec 3<>/dev/tcp/www.baidu.com/80
            $ echo -e "GET / HTTP/1.0\r\n\r\n" >&3
            $ cat <&3
            $ ls -l /proc/$$/fd
            total 0
            lr-x------ 1 admin admin 64 2016-03-30 10:14 0 -> /dev/pts/413
            lrwx------ 1 admin admin 64 2016-03-30 10:14 1 -> /dev/pts/413
            lrwx------ 1 admin admin 64 2016-03-30 10:14 2 -> /dev/pts/413
            lrwx------ 1 admin admin 64 2016-03-30 10:14 255 -> /dev/pts/413
            lrwx------ 1 admin admin 64 2016-03-30 10:14 3 -> socket:[173770096]
            $ exec 3>&- # exec 3<&-也可以關(guān)閉

    posted on 2016-03-30 12:10 so true 閱讀(252) 評論(0)  編輯  收藏 所屬分類: Linux

    主站蜘蛛池模板: 成人性生交大片免费看中文| 成人免费ā片在线观看| 亚洲18在线天美| 亚洲国产综合精品中文第一| 亚洲av日韩aⅴ无码色老头| 深夜福利在线视频免费| 国产午夜无码精品免费看| 无码国产精品一区二区免费I6| 国产精品免费综合一区视频| 色久悠悠婷婷综合在线亚洲| 91亚洲va在线天线va天堂va国产| 亚洲偷自拍另类图片二区| 中文字幕不卡免费高清视频| 亚洲欧洲日产国码无码网站| 亚洲 日韩 色 图网站| 免费毛片在线视频| 亚洲av无码成人黄网站在线观看| 亚洲七久久之综合七久久| 中文字幕在线免费| 亚洲伊人成无码综合网| 亚洲一区二区三区无码国产 | 亚洲中文字幕日本无线码| 成人A片产无码免费视频在线观看| 亚洲国产第一站精品蜜芽| 人妖系列免费网站观看| 亚洲中文字幕无码中文字在线| 182tv免费视频在线观看 | 亚洲av中文无码乱人伦在线咪咕| 91人成网站色www免费下载| 亚洲综合一区二区三区四区五区| 国产美女无遮挡免费视频| 9久热精品免费观看视频| 免费国产在线观看老王影院| 波多野结衣亚洲一级| 亚洲AV无码成H人在线观看| 亚洲H在线播放在线观看H| va亚洲va日韩不卡在线观看| 亚洲欧美熟妇综合久久久久| 中文字幕亚洲激情| 久青草视频在线观看免费| 亚洲国产精品乱码在线观看97|