linux輸入輸出重新導向使用詳解_Linux

來源:互聯網
上載者:User

1. 輸出重新導向:

預設條件下,標準輸出和錯誤輸出都是終端,可以把標準輸出和錯誤內容進行重新導向:

複製代碼 代碼如下:

[~]# echo "hello\!"
hello\!
[~]# echo "hello!"
-bash: !": event not found "

把標準輸出重新導向到檔案

複製代碼 代碼如下:

[~]# echo "hello" > test.sh
[~]# cat test.sh
hello
'>'輸出方式預設等價'1>'
[~]#  echo "hello" 1> test.sh
[~]# cat test.sh
hello

但是錯誤內容還是會顯示在螢幕上:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh > temp.sh
cat: /root/test.sh: Permission denied

可以把錯誤內容也輸出到檔案中(利用檔案描述符):

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh 1> temp.sh 2> error.sh
[~]$cat temp.sh
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/
[~]$cat error.sh
cat: /root/test.sh: Permission denied

把標準輸出和錯誤資訊寫入同一個檔案:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh > temp.sh 2>&1
[~]$cat temp.sh
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/
cat: /root/test.sh: Permission denied

這個看起來比較麻煩,實際應用中可能用的最多的是:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh &>temp.sh
[~]$cat temp.sh
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/
cat: /root/test.sh: Permission denied
&>把所有輸出都寫入同一個檔案

如果不想輸出到檔案,也不想在螢幕上顯示,可以利用/dev/null這一特殊裝置檔案(bit bucket)
[~]$cat edit.sql /root/test.sh &>/dev/null
如果把標準輸出寫入到檔案,就沒法利用管道符號'|'把內容傳給接下來的命令,可以利用tee命令解決這個問題:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh | tee temp.sh | cat -n
cat: /root/test.sh: Permission denied
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
             dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
             dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
               dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/


tee命令相當於把stdout副本寫入檔案,再把stdout傳給下一個命令,但是錯誤內容是無法用tee傳遞的,如同使用>>追加內容,tee可以使用-a選項追加:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh | tee -a temp.sh | cat -n
cat: /root/test.sh: Permission denied
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
             dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
            dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
               dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/
[~]$cat temp.sh
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/

2.輸入重新導向

輸入重新導向,在一些場合,例如資料庫監控中用的比較多,常見的是使用內聯重新導向

複製代碼 代碼如下:

[~]$cat < edit.sql
select           dbms_rowid.rowid_object('AAAZdQAAGAAATxjAAk') data_object_id#,
dbms_rowid.rowid_relative_fno('AAAZdQAAGAAATxjAAk') rfile#,
dbms_rowid.rowid_block_number('AAAZdQAAGAAATxjAAk') block#,
dbms_rowid.rowid_row_number('AAAZdQAAGAAATxjAAk') row# from dual
/

例如,如下操作,把 <<EOF > temp.sh到最後EOF之間的內容當作stdin,然後把stdout寫入檔案temp.sh

複製代碼 代碼如下:

[~]$cat <<EOF > temp.s
this is my log
EOF
[~]$cat temp.sh
this is my log

3.自訂檔案描述符:

自訂檔案描述符的原理是使用基本的三種檔案開啟模式
唯讀(<)
截斷(>)
追加(>>)
建立一個檔案描述符3,用於開啟檔案
[~]# exec 3< test.sh
下面就可以直接使用檔案描述符開啟檔案了,但是只能使用一次:

複製代碼 代碼如下:

[~]# cat <&3
hello
hello

建立檔案描述符4,用於寫入檔案(可以複用):

複製代碼 代碼如下:

[~]# exec 4>test.sh
[~]# echo okok >&4
[~]# cat test.sh
okok

這個實際類似前面的:

複製代碼 代碼如下:

[~]$cat edit.sql /root/test.sh > temp.sh 2>&1

建立檔案描述符5,用於向檔案追加內容(也可以複用,不像輸入檔案描述符那樣只能使用1次):

複製代碼 代碼如下:

[~]# exec 5>>test.sh
[~]# echo okokok >&5
[~]# cat test.sh    
okokok
[~]# echo okokok >&5
[~]# cat test.sh   
okokok
okokok

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.