重定向命令其實用得不少吧,只是重來都沒有仔細看過,這波正好又用到 又有空總結一波。
先看>和>>:
他們倆其實唯一的區別就是>是重定向到一個文件,>>是追加內容到文件。兩個命令都是如果文件不存在則創建文件。舉個例子來看看:
(thrift_rpc)piperck➜ Desktop ᐅ ll >> 123.txt (thrift_rpc)piperck➜ Desktop ᐅ ll | grep 123.txt-rw-r--r-- 1 piperck staff 2.8K Dec 25 00:24 123.txt
可以看到可以將ll的輸出 重定向到123.txt中, >也是同樣的效果。只是如果使用>執行重定向的位置沒有這個文件
(thrift_rpc)piperck➜ Desktop ᐅ ls > /poweqpikp/123zsh: no such file or directory: /poweqpikp/123(thrift_rpc)piperck➜ Desktop ᐅ ls >> /poweqpikp/123zsh: no such file or directory: /poweqpikp/123(thrift_rpc)piperck➜ Desktop ᐅ ls > 123(thrift_rpc)piperck➜ Desktop ᐅ ls >> 1234
但是如果你重定向的是沒有的文件夾裏面的文件,那麼文件夾他是不會幫你創建的,所以會報出錯誤,這點要注意。
然後是 1>、 2>、 1>>、 2>>的使用,
當我們需要把一個文件正確的輸出,和錯誤的輸出分開保存的時候就能用到他們啦。讓我用一個簡單的python腳本來做一個實驗
python腳本如下
# coding: utf-8if __name__ == '__main__': print 'gogogog' int('qiowjeioqwjeo')
該腳本會正確執打印gogogog 然後 報出下面強轉的錯誤。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1> right.txt 2> wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ ls NS8A_client gevent pp.py starcraft2 baidu_phoneassist laplace_pra right.txt wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可以看到,正確的輸出被保存進了right.txt 而錯誤的輸出被重定向到了wrong.txt 。
那麼如果我們不區分1>2>這樣的重定向規則,運行結果會被保存成什麼樣子呢?
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py > pp.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'(thrift_rpc)piperck➜ py_pra ᐅ cat pp.txt gogogog
可以看到只保存了正確的結果,錯誤的信息被打印到標準輸出上面。
那如果我們想讓錯誤和正確的結果都被重定向到同一個文件又應該怎麼做呢。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1> ppp.txt 2>&1(thrift_rpc)piperck➜ py_pra ᐅ cat ppp.txt gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可以看到,我們將錯誤也重定向到和1相同的文件 就實現了這個需求。
同理1>> 2>>其實也就是追加數據到文件中,和前面介紹的> >>沒有什麼不同,需要提到的一點是,如果我們想將錯誤的和正確的信息重定向追加到同一個文件應該怎麼做呢?你可能會想到2>>&1。。。然而現實是,並沒有這個語法。
然而我們卻可以使用1>>pp.txt 2>&1的語法實現這個功能
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>> pp.txt 2>&1(thrift_rpc)piperck➜ py_pra ᐅ cat pp.txt gogogog gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可見看似1> 1>> 2> 2>>是相一一對應的,但是其實不是,他們可以混用,比方說正確的結果想追加,錯誤的結果我想覆蓋。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>wrong.txt(thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
類似這種組合混用的情況,相對來說也不少見。也可以看出重定向標識的靈活性。
那麼如果我們想保存正確的結果,錯誤的結果直接丟向垃圾站,既不保存爲文件,也不在標準輸出打印又該怎麼做呢?
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>/dev/null (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog gogogog gogogog
直接將錯誤輸出重定向到/dev/null 就好了,他就像一個無底洞,丟進去的東西就不見了。
那麼<又是什麼意思呢?<可以將原本由標準輸入改爲由指定地方輸入舉個例子就明白了:
(thrift_rpc)piperck➜ py_pra ᐅ vi hh (thrift_rpc)piperck➜ py_pra ᐅ >> txt.py < hh (thrift_rpc)piperck➜ py_pra ᐅ cat txt.py qwejqwoijeoq
靈活使用重定向標識符 將極大方便我們日常對系統的操作,和靈活控制腳本的運作,所以一定要掌握喲!