????每個進程都至少有3個信息:“標準輸入”stdin、“標準輸出”stdout、和“標準出錯”stderr。標準輸入通常來自鍵盤,標準輸出和標準錯誤輸出通常被發往屏幕(并不會保存在磁盤文件中)。有些時候,需要從文件讀取輸入,或者將輸出結果和報錯信息寫入文件(寫入文件后不會在屏幕顯示)。這些都可以通過I/O重定向來實現。

重定向操作符

重定向操作符功能
<重定向輸入
>重定向輸出
>>追加輸出
2>重定向標準錯誤輸出
1>&2將輸出重定向到標準錯誤輸出的去處
2>&1將標準輸出和標準錯誤重定向到同一個文件

程序:指令+數據

讀入數據:Input

輸出數據:Output

打開的文件都有一個fd:file descriptor(文件描述符)

標準輸入:keyborad,0

標準輸出:monitor,1

標準錯誤輸出:mointor,2

IO重定向:改變標準位置

輸出重定向:COMMAND > NEW_POS,COMMAND >> NEW_POS

>:覆蓋重定向,目標文件中的原有內容會被清除;

>>:添加重定向,新內容會追加至目標文件尾部;

#set -C:禁止覆蓋輸出重定向至已存在的文件,可以追加>>,

強制覆蓋:> | 注:加入管道符,強制覆蓋

#set +C:關閉上述特性

2>:覆蓋重定向錯誤輸出數據流;

2>>:追加重定向錯誤輸出數據流;

標準輸出和錯誤輸出各自定向至不同位置:

COMMAND > /path/to/file.out 2> /path/to/error.out

[root@node1 ~]# tail -5 /etc/rc.d/rc.local >/tmp/sys.out 2>/tmp/sys.err

注:命令執行后sys.out和sys.err文件都會產生,有一個為空。

合并標準輸出和錯誤輸出為同一個數據流進行重定向:

&>:覆蓋重定向 ? ? ? ? ?echo "$PATH" &> /tmp/path.out

&>>:追加重定向 ? ? ? ? echo "$PATH" &>> /tmp/path.out

COMMAND > /path/to/file.out 2> &1

這種方法也可以實現正確和錯誤都定向到同一文件,2> &1 :2表示錯誤,&1表示/path/to/file.out。這種方式更為靈活

上面內容源自馬哥運維學習的筆記


示例

? ? 輸入重定向?<?使用tr命令,把/etc/issue中的內容,把所有換成大寫

[root@c6 ~]# cat /etc/issue

CentOS release 6.5 (Final)

Kernel \r on an \m


[root@c6 ~]# tr 'a-z' 'A-Z' < /etc/issue

CENTOS RELEASE 6.5 (FINAL)

KERNEL \R ON AN \M


? ? ls命令將它的輸出重定向到文件lsfile,不把輸出結果發往屏幕

[root@c6 ~]# ls > lsfile

[root@c6 ~]# cat lsfile?

anaconda-ks.cfg

install.log

install.log.syslog

lsfile

shell.sh

shell.txt

zbox

? ? date命令的輸出結果重定向追加到lsfile中

[root@c6 ~]# date >> lsfile

[root@c6 ~]# cat lsfile?

anaconda-ks.cfg

install.log

install.log.syslog

lsfile

shell.sh

shell.txt

zbox

Thu Nov 24 11:42:55 CST 2016

????將錯誤輸出,重定向到errfile中

[root@c6 ~]# lq 2> errfile

[root@c6 ~]# cat errfile?

-bash: lq: command not found

? ? 把標準輸出重定向到output.txt下。錯誤信息則被發往/dev/null,/dev/null相當于黑洞,把任何東西放里面,都沒了

[root@c7 app]# ld > output.txt 2> /dev/null

? ? 如果我們希望把所有輸出的內容都放在同一個獨立文件中,使用2>&1

[root@c7 app]# ls -l /bin/users > ls-output.txt 2>&1

?說明:使用這個方法,將執行兩個重定向操作。首先重定向標準輸出到ls-output.txt文件中,然后使用標記符2>&1的文件描述符2(標準錯誤)重定向到文件描述符1(標識輸出)中。

???find命令查找echo命令將它的信息發往標準錯誤輸出。該命令的標準輸出也一同被發往標準錯誤輸出中

[root@c7 app]# echo "Hello world" 1>&2

Hello world


學習自:

UNIX.shell范例精解(第4版)

馬哥Linux