大多數 Unix 系統命令從終端的輸入和發送所產生的輸出返回到您的終端。一個命令通常從一個地方叫標準輸入,默認情況下,這恰好是你的終端讀取輸入。同樣,一個命令通常寫入其輸出到標準輸出,這也是默認情況下,從你的終端。
輸出重定向:
通常用於標準輸出命令的輸出可以很容易地轉移到一個檔中代替。這種能力被稱為輸出重定向:
如果記號> file附加任何命令,通常寫入其輸出到標準輸出,該命令的輸出將被寫入檔,而不是你的終端:
檢查使用 who 命令,將完整的輸出重定向命令在用戶檔。
$ who > users
請注意,沒有輸出出現在終端中。這是因為輸出已被重定向到指定的檔從默認的標準輸出設備(終端)。如果想檢查用戶的檔,然後將完整的內容:
$ cat users oko tty01 Sep 12 07:30 ai tty15 Sep 12 13:32 ruth tty21 Sep 12 10:10 pat tty24 Sep 12 13:07 steve tty25 Sep 12 13:03 $
如果命令輸出重定向到一個檔,該檔已經包含了一些數據,這些數據將會丟失。考慮這個例子:
$ echo line 1 > users $ cat users line 1 $
您可以使用>>運算符將輸出附加在現有的檔如下:
$ echo line 2 >> users $ cat users line 1 line 2 $
輸入重定向:
正如一個命令的輸出可以被重定向到一個檔中,所以可以輸入一個命令從檔重定向。作為不是字元>用於輸出重定向,小於字元<用於重定向一個命令的輸入。
通常需要的命令,他們從標準輸入的輸入可以有自己的這種方式從檔輸入重定向。例如,上面生成的檔中的用戶的數量來計算的行,可以執行如下命令:
$ wc -l users 2 users $
在這裏,它產生的輸出2行。可以指望的檔中的行數 wc 命令的標準輸入重定向用戶從檔:
$ wc -l < users 2 $
請注意,在由兩種形式的wc命令產生的輸出是有區別的。在第一種情況下,該檔的用戶的名稱列出的行數,在第二種情況下,它不是。
在第一種情況下,wc 知道,它是用戶從檔讀取輸入。在第二種情況下,只知道它是從標準輸入讀取輸入,所以它不顯示檔案名。
Here 文檔:
here document 是用來輸入重定向到一個互動式shell腳本或程式。
在一個shell腳本中,我們可以運行一個互動式程式,無需用戶操作,通過提供互動程式或互動式shell腳本所需的輸入。
這裏的檔的一般形式是:
command << delimiter document delimiter
這裏的 shell 解釋<<操作指令讀取輸入,直到它找到含有指定分隔符號線。所有輸入行的行分隔符號,然後送入標準輸入的命令。
分界符告訴shell 這裏檔已完成。沒有它,shell 不斷的讀取輸入。分隔符號必須是一個字不包含空格或跳位字元。
以下是輸入命令wc -1 進行計數的行的總數:
$wc -l << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF 3 $
可以在here document 列印多行,使用你的腳本如下:
#!/bin/sh cat << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF
這將產生以下結果:
This is a simple lookup program for good (and bad) restaurants in Cape Town.
下麵的腳本運行一個會話vi文本編輯器中的輸入和保存檔test.txt。
#!/bin/sh filename=test.txt vi $filename <<EndOfCommands i This file was created automatically from a shell script ^[ ZZ EndOfCommands
如果運行這個腳本,用vim作為vi,那麼很可能會看到類似以下的輸出:
$ sh test.sh Vim: Warning: Input is not from a terminal $
運行該腳本後,你應該看到以下內容添加到檔test.txt:
$ cat test.txt This file was created automatically from a shell script $
丟棄輸出:
有時會需要執行命令,但不想顯示在螢幕上的輸出。在這種情況下,可以丟棄的輸出重定向到檔 /dev/null:
$ command > /dev/null
這裏 command 是要執行的命令的名字。檔/dev/null 是一個特殊的檔自動放棄其所有的輸入。
同時要放棄一個命令的輸出和錯誤輸出,使用標準的重定向到STDOUT 到 STDERR重定向:
$ command > /dev/null 2>&1
在這裏,2代表stderr和1代表STDOUT。可以上顯示一條消息到STDERR 到 STDERR重定向標準輸入到如下:
$ echo message 1>&2
重定向命令:
以下是命令,可以使用重定向的完整列表:
命令 | 描述 |
---|---|
pgm > file | Output of pgm is redirected to file |
pgm < file | Program pgm reads its input from file. |
pgm >> file | Output of pgm is appended to file. |
n > file | Output from stream with descriptor n redirected to file. |
n >> file | Output from stream with descriptor n appended to file. |
n >& m | Merge output from stream n with stream m. |
n <& m | Merge input from stream n with stream m. |
<< tag | Standard input comes from here through next tag at start of line. |
| | Takes output from one program, or process, and sends it to another. |
需要注意的是檔描述符0是正常標準輸入(STDIN),1是標準輸出(STDOUT),標準錯誤輸出(STDERR)。