Shell 輸入/輸出重定向

2021-08-31 09:58 更新

大多數(shù) Unix 系統(tǒng)命令從終端的輸入和發(fā)送所產(chǎn)生的輸出返回??到您的終端。一個(gè)命令通常從一個(gè)地方叫標(biāo)準(zhǔn)輸入,默認(rèn)情況下,這恰好是你的終端讀取輸入。同樣,一個(gè)命令通常寫入其輸出到標(biāo)準(zhǔn)輸出,這也是默認(rèn)情況下,從你的終端。

輸出重定向:

通常用于標(biāo)準(zhǔn)輸出命令的輸出可以很容易地轉(zhuǎn)移到一個(gè)文件中代替。這種能力被稱為輸出重定向:

如果記號> file附加任何命令,通常寫入其輸出到標(biāo)準(zhǔn)輸出,該命令的輸出將被寫入文件,而不是你的終端:

檢查使用 who 命令,將完整的輸出重定向命令在用戶文件。

$ who > users

請注意,沒有輸出出現(xiàn)在終端中。這是因?yàn)檩敵鲆驯恢囟ㄏ虻街付ǖ奈募哪J(rèn)的標(biāo)準(zhǔn)輸出設(shè)備(終端)。如果想檢查用戶的文件,然后將完整的內(nèi)容:

$ 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
$

如果命令輸出重定向到一個(gè)文件,該文件已經(jīng)包含了一些數(shù)據(jù),這些數(shù)據(jù)將會丟失??紤]這個(gè)例子:

$ echo line 1 > users
$ cat users
line 1
$

您可以使用>>運(yùn)算符將輸出附加在現(xiàn)有的文件如下:

$ echo line 2 >> users
$ cat users
line 1
line 2
$

輸入重定向:

正如一個(gè)命令的輸出可以被重定向到一個(gè)文件中,所以可以輸入一個(gè)命令從文件重定向。作為不是字符>用于輸出重定向,小于字符<用于重定向一個(gè)命令的輸入。

通常需要的命令,他們從標(biāo)準(zhǔn)輸入的輸入可以有自己的這種方式從文件輸入重定向。例如,上面生成的文件中的用戶的數(shù)量來計(jì)算的行,可以執(zhí)行如下命令:

$ wc -l users
2 users
$

在這里,它產(chǎn)生的輸出2行。可以指望的文件中的行數(shù) wc 命令的標(biāo)準(zhǔn)輸入重定向用戶從文件:

$ wc -l < users
2
$

請注意,在由兩種形式的wc命令產(chǎn)生的輸出是有區(qū)別的。在第一種情況下,該文件的用戶的名稱列出的行數(shù),在第二種情況下,它不是。

在第一種情況下,wc 知道,它是用戶從文件讀取輸入。在第二種情況下,只知道它是從標(biāo)準(zhǔn)輸入讀取輸入,所以它不顯示文件名。

Here 文檔:

 here document 是用來輸入重定向到一個(gè)交互式shell腳本或程序。

在一個(gè)shell腳本中,我們可以運(yùn)行一個(gè)交互式程序,無需用戶操作,通過提供互動程序或交互式shell腳本所需的輸入。

這里的文件的一般形式是:

command << delimiter
document
delimiter

這里的 shell 解釋<<操作指令讀取輸入,直到它找到含有指定分隔符線。所有輸入行的行分隔符,然后送入標(biāo)準(zhǔn)輸入的命令。

分界符告訴shell 這里文件已完成。沒有它,shell 不斷的讀取輸入。分隔符必須是一個(gè)字不包含空格或制表符。

以下是輸入命令wc -1 進(jìn)行計(jì)數(shù)的行的總數(shù):

$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	

這將產(chǎn)生以下結(jié)果:

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

下面的腳本運(yùn)行一個(gè)會話vi文本編輯器中的輸入和保存文件test.txt。

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

如果運(yùn)行這個(gè)腳本,用vim作為vi,那么很可能會看到類似以下的輸出:

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

運(yùn)行該腳本后,你應(yīng)該看到以下內(nèi)容添加到文件test.txt:

$ cat test.txt
This file was created automatically from
a shell script
$

丟棄輸出:

有時(shí)會需要執(zhí)行命令,但不想顯示在屏幕上的輸出。在這種情況下,可以丟棄的輸出重定向到文件 /dev/null:

$ command > /dev/null

這里 command 是要執(zhí)行的命令的名字。文件/dev/null 是一個(gè)特殊的文件自動放棄其所有的輸入。

同時(shí)要放棄一個(gè)命令的輸出和錯(cuò)誤輸出,使用標(biāo)準(zhǔn)的重定向到STDOUT 到 STDERR重定向:

$ command > /dev/null 2>&1

在這里,2代表stderr和1代表STDOUT。可以上顯示一條消息到STDERR 到 STDERR重定向標(biāo)準(zhǔn)輸入到如下:

$ 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是正常標(biāo)準(zhǔn)輸入(STDIN),1是標(biāo)準(zhǔn)輸出(STDOUT),標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。

 




以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號