寫腳本代碼的時候重定向是一個很重要的功能,比如打印日志什么的都需要用到。
大體來說: 重定向分為兩種,一種叫臨時重定向,一種叫長久重定向。
臨時重定向就是每次在輸出的時候都必須指定重定向:
echo good for u > log
這里實際上省略了一個1(標准輸入),代表將標准輸入轉向到log中。
linux每個進程都有0, 1, 2 三個文件描述符。 重定向就是將這些文件描述符關聯到相應的文件(設備), 比如默認的是0關聯到標准輸入,1關聯到標准輸出, 2關聯到標准錯誤
如果你覺得你需要將他們關聯到不同的地方那么就 進行重定向----實際上就是改變0,1,2 關聯到的文件, 比如上面的例子, 1 默認關聯的是標准輸出,也就是顯示器, 經過上面
的更改, 那么1 現在關聯到了log文件之中。 我們echo 輸出 總是輸出到 文件描述符1 中的。 如果1 關聯的是顯示器就輸入到顯示器上, 1 關聯的是log文件,那么就顯示到log文件上
舉個栗子:
0 ----- 鍵盤
1 ----- 顯示器
2 ----- 顯示器
重定向就是改變對應關系。經過上面的命令后,對應關系變成了這樣。 注意程序中的輸入輸出都是操作的文件描述符(也就是0,1,2這些數字),這些數字關聯什么設備就從對應的設備進行
操作,這點明白后就了解重定向了。
0 ----- 鍵盤
1 ----- log
2 ----- 顯示器
臨時重定向比較簡單。 每次 指定就可以了。
下面說下exec命令。 這個就是 linux里面的永久重定向功能、
下面用一些例子說明:
首先需要介紹&,這個符號在重定向里面和后面的數字一起代表后面的數字表示的設備。
exec 1>&2
那么上面這句話的意思就是。 將 1 關聯到了 2 對應的設備上。 也就是標准輸出對應到標准錯誤輸出上了, 由於都是顯示器。 所以就沒有區別了。
exec 2>log
上面這句話就是將標准錯誤輸出寫到log文件里面
exec 1>/dev/null 2>&1
上面的要注意。 將1對應到null文件上。 然后將2定位到1對應的文件上。 那么實際上1和2都指向null文件了。
注意千萬不要反過來。
exec 2>&1 1>/dev/null
這個和上面不同的是:將2對應到1對應的設備上(現在1還未重定向,所以對應的是顯示器), 那么2對應顯示器,然后1對應null文件。
有時候需要重定向之后又恢復到以前的標准。所以需要一個臨時的替代文件描述符
換句話說 你將 1對應到null文件之后 , 你又重新想定位到 顯示器, 那么怎么找到這個顯示器呢? 就得有個文件描述符來指向顯示器。
比如
exec 6>&1 1代表的設備是顯示器。 執行這句話后 6就是指向顯示器了。
exec 1>log 然后1定向到log
輸出一些東西
(在輸出的時候如果需要輸出到顯示器, 可以采用&6來訪問顯示器)
exec 1>&6 然后1又恢復到顯示器
exec 6>&- 這句話相當於刪除掉臨時的文件描述符
關鍵點: &符號的意思: 相當於指針一樣, 和文件描述符一起代表設備
exec 的用法。多試試就OK 。