一、解讀重定向
程序必須能夠讀入輸入然後經過加工來顯示結果,程序獲取的數據也多種多樣,程序生產出來的結果也是多種多樣的。也就是說程序要有讀入也要有輸出。
讀入數據:Input
輸出數據:Output
在linux中一切接文件。這就意味着,任何設備在系統中都有一個與之對應的文件。所以我們就可以通過文件來訪問設備。對於用戶來說,訪問文件就是通過文件名來進行的,用戶看到的是文件名,但是,對於內核來說,所有都是數字,這個數字就是文件描述符來訪問文件。打開現存文件或新的文件時,內核返回一個fd。讀寫文件都需要使用fd來制定讀寫的文件。fd:file descriptor(文件描述符)
linux給程序提供三種I/O設備
標準輸入(STDIN) -0 默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1 默認輸出到終端窗口
標準錯誤(STDERR)-2 默認輸出到終端窗口
I/O重定向:改變默認位置
當執行重定向時我們看到 ls顯示的結果被輸出到一個新的文件中,如果testdir中沒有該文件,那麼將自動創建該文件。
而我又將ll結果重定向到文件中,那麼我們會發現,之前的結果沒有了,都被覆蓋了,所以文件的創建方法是。
1:該文件若不存在,系統會自動建立該文件。
2:當這個文件存在,系統會將這個文件的內容清空,讓後將數據寫入。
3:如果以>輸出到一個已存在的文件,文件會被覆蓋。
如果我們不想覆蓋該文件使用>>(累加)就可以了
二、重定向具體用法
STDOUT和TDERR可以被重定向到文件:
命令 操作符號 文件名
支持的操作符號有:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
>文件內容會被覆蓋
#set -C:禁止將內容覆蓋已有文件,但可追加強制覆蓋:>|
#set+C:允許覆蓋
>> 原有內容基礎上,追加內容
把輸出和錯誤重新定向到文件
2>:覆蓋重定向錯誤輸出數據流;
2>>:追加重定向錯誤輸出數據流;
標準輸出和錯誤輸出各自定向至不同位置:
COMMAND > /path/to/file.out > /path/to/error.out
合併標準輸出和錯誤輸出爲同一個數據流進行重定向
&>:覆蓋重定向
&>>:追加重定向
COMMAND > /path/to/file.out 2>&1(順序重要)
COMMAND >> /path/to/file.out 2>>&1(順序重要)
find /etc -name passwd 2> /dev/null
/dev/null垃圾桶黑洞的用法
如果我們知道會出現大量的錯誤信息而又不想讓它顯示出來,這個時候使用黑洞設備/dev/null。它可以吃掉導向它的所有信息
():合併多個程序的STDOUT
(cal 2007;cal2008)>all.txt
standard input:<與<<
<就是講原本需要由鍵盤輸入的數據改由文件內容來替代。如下圖所示。
<很有幫助,尤其是在發郵件mail這種命令中。那麼<<又是什麼意思呢,它代表結束輸入的意思。如下圖
可以看出end就是結束輸入,他並沒有顯示在文件中。
使用<來重定向標準輸入
某些命令能夠接受從文件中導入的STDIN:
$tr 'a-z' 'A-Z'< /etc/issue
將文件中的小寫字母轉換爲大寫字母。
tr -d abc</etc/issue
刪除issue文件中所有abc中任意字母。
#cat > filea
按ctrl+d離開,可以使用文件來代替鍵盤的輸入
#Cat > filea < fileb
tr-轉換和刪除字符
tr[OPTION]...SET1[SET2]
選項:
-c或--complerment:取字符集的補集
-d或--delete:刪除所有屬於第一字符集的字符
-s或-squeeze-repeats:把連續重複的字符以單獨一個字符表示
-t或--truncate-set1:將第一個字符集對應字符轉化爲第二字符集對應的字符
管道
管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的 STDOUT發送到命令3的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
最後一個命令會在當前shell進程的子shell進程中執行用來
組合多種工具的功能
ls | tr 'a-z' 'A-Z'
less :一頁一頁地查看輸入:
$ ls -l /etc | less
mail: 通過電子郵件發送輸入:
$ echo "test email" | mail \ -s "test" [email protected]