linux輸入輸出重定向使用詳解
1. 輸出重定向:
默認(rèn)條件下,標(biāo)準(zhǔn)輸出和錯誤輸出都是終端,可以把標(biāo)準(zhǔn)輸出和錯誤內(nèi)容進(jìn)行重定向:
[~]# echo "hello\!"
hello\!
[~]# echo "hello!"
-bash: !": event not found "
把標(biāo)準(zhǔn)輸出重定向到文件
[~]# echo "hello" > test.sh
[~]# cat test.sh
hello
'>'輸出方式默認(rèn)等價'1>'
[~]# echo "hello" 1> test.sh
[~]# cat test.sh
hello
但是錯誤內(nèi)容還是會顯示在屏幕上:
[~]$cat edit.sql /root/test.sh > temp.sh
cat: /root/test.sh: Permission denied
可以把錯誤內(nèi)容也輸出到文件中(利用文件描述符):
[~]$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
把標(biāo)準(zhǔn)輸出和錯誤信息寫入同一個文件:
[~]$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
這個看起來比較麻煩,實際應(yīng)用中可能用的最多的是:
[~]$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這一特殊設(shè)備文件(bit bucket)
[~]$cat edit.sql /root/test.sh &>/dev/null
如果把標(biāo)準(zhǔn)輸出寫入到文件,就沒法利用管道符號'|'把內(nèi)容傳給接下來的命令,可以利用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命令相當(dāng)于把stdout副本寫入文件,再把stdout傳給下一個命令,但是錯誤內(nèi)容是無法用tee傳遞的,如同使用>>追加內(nèi)容,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.輸入重定向:
輸入重定向,在一些場合,例如數(shù)據(jù)庫監(jiān)控中用的比較多,常見的是使用內(nèi)聯(lián)重定向
[~]$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之間的內(nèi)容當(dāng)作stdin,然后把stdout寫入文件temp.sh
[~]$cat <<EOF > temp.s
this is my log
EOF
[~]$cat temp.sh
this is my log
3.自定義文件描述符:
自定義文件描述符的原理是使用基本的三種文件打開模式
只讀(<)
截斷(>)
追加(>>)
創(chuàng)建一個文件描述符3,用于打開文件
[~]# exec 3< test.sh
下面就可以直接使用文件描述符打開文件了,但是只能使用一次:
[~]# cat <&3
hello
hello
創(chuàng)建文件描述符4,用于寫入文件(可以復(fù)用):
[~]# exec 4>test.sh
[~]# echo okok >&4
[~]# cat test.sh
okok
這個實際類似前面的:
[~]$cat edit.sql /root/test.sh > temp.sh 2>&1
創(chuàng)建文件描述符5,用于向文件追加內(nèi)容(也可以復(fù)用,不像輸入文件描述符那樣只能使用1次):
[~]# exec 5>>test.sh
[~]# echo okokok >&5
[~]# cat test.sh
okokok
[~]# echo okokok >&5
[~]# cat test.sh
okokok
okokok
相關(guān)文章
Linux操作系統(tǒng)安裝圖文配置教程詳細(xì)版
這篇文章主要為大家詳細(xì)介紹了Linux操作系統(tǒng)安裝圖文配置教程,幫助大家順利的安裝Linux操作系統(tǒng),感興趣的小伙伴們可以參考一下2016-09-09Linux學(xué)習(xí)第三篇 Centos7安裝mysql5.7.16數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了Linux學(xué)習(xí)第三篇,Centos7安裝mysql5.7.16數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05在Ubuntu 14 上安裝 Nginx-RTMP 流媒體服務(wù)器的教程
RTMP流媒體協(xié)議是 一套 Adobe 開發(fā)的音頻視頻實時傳輸協(xié)議;nginx-rtmp 是一個基于nginx的 RTMP服務(wù)模塊,開源,免費,接下來通過本文給大家介紹在Ubuntu 14 上安裝 Nginx-RTMP 流媒體服務(wù)器,需要的朋友可以參考下2019-11-11微信小程序 Linux開發(fā)環(huán)境設(shè)置詳解
這篇文章主要介紹了微信小程序 Linux開發(fā)環(huán)境設(shè)置詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01修改wamp的apache默認(rèn)端口80為8088以及www目錄
這篇文章主要介紹了修改wamp的apache默認(rèn)端口80為8088以及www目錄為workphp,需要的朋友可以參考下2014-03-03