linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <

重定向命令其實用得不少吧,只是重來都沒有仔細看過,這波正好又用到 又有空總結一波。

先看>和>>:

他們倆其實唯一的區別就是>是重定向到一個文件,>>是追加內容到文件。兩個命令都是如果文件不存在則創建文件。舉個例子來看看:

(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

靈活使用重定向標識符 將極大方便我們日常對系統的操作,和靈活控制腳本的運作,所以一定要掌握喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章