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