在Linux中執行一個shell命令行時通常會自動打開三個標准文件,即標准輸入文件(stdin),通常對應終端的鍵盤;標准輸出文件(stdout)和標准錯誤文件(stderr),這兩個文件都對應終端的屏幕。進程將從標准輸入文件中得到輸入數據,將正常輸出數據輸出到標准輸出文件,而將錯誤信息送到標准錯誤文件中。
標准輸入(stdin)的文件代碼為0,標准輸出(stdout)的文件代碼為1,標准錯誤(stderr)的文件代碼為2。Linux的一大特點就是標准輸入/輸出可以重定向。
一、輸出重定向
輸出重定向是指把命令(或可執行程序)的標准輸出或標准錯誤重新定向到指定文件中。使用 > 符號。
舉例:
1、
# echo "hellohello" > 1.txt
此時屏幕上無任何輸出,當前目錄下生成1.txt文件內容就是echo輸出的語句。
二、輸入重定向
輸入重定向是指把命令(或可執行程序)的標准輸入重定向到指定的文件中。也就是說,輸入可以不來自鍵盤,而來自一個指定的文件。使用 < 符號。
舉例:
1、
# wc -l < /etc/passwd
統計/etc/passwd文件的行數。wc命令的標准輸入來自於/etc/passwd文件。
三、轉向附加
使用輸出重定向到一個文件,如果該文件已經存在的話,會先清空該文件的內容,再將信息寫入。如果想保留原文件的內容,可以使用 >> 符號,起到追加的作用。
舉例:
1、
# echo "test1" > 2.txt
# echo "test2" >> 2.txt
# cat 2.txt
test1
test2
四、組合使用
轉向輸入和轉向輸出組合使用實現更多的功能。
舉例:
1、
# cat < 1.txt > 3.txt
指定cat命令的標准輸入來自1.txt,標准輸出轉向到3.txt。結果就是3.txt和1.txt內容相同。
2、
# cat > 4.txt < 3.txt
指定cat命令的標准輸出轉向到4.txt,標准輸入來自3.txt。結果就是4.txt和3.txt內容相同。
從上面兩個例子看出效果是一樣的,說明標准輸入/輸出重定向沒有先後順序。
3、<< 符號
# cat > 6.sh << EOF
> #! /bin/bash
> echo "hello world!"
> EOF
說明:> 符號表示標准輸出重定向到6.sh,標准輸入還是來自默認的鍵盤。<< 符號用來定義結束符,任何字符都可以作為結束符,一般定義為EOF。這裡當輸入到EOF後,此次輸入就結束了。
五、>/dev/null 2>&1 & 是什麼意思?
常在shell腳本裡看到:>/dev/null 2>&1 & 這樣的語句。
說明:
1)/dev/null代表空設備。
2)>/dev/null表示將前面命令執行後的標准輸出重定向,全都丟到空設備裡。
3)&表示等同於的意思,2>&1表示2的輸出重定向等同於1,即將標准錯誤重定向到標准輸出,由於標准輸出已經重定向到了/dev/null,因此標准錯誤也會重定向到/dev/null。
4)最後一個&表示後台運行。