您可以通過兩種方式顯示shell腳本的輸出,在屏幕上顯示輸出或者將輸出發(fā)送到文件。
在本教程中我們說明Shell腳本中必不可少的知識,即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和重定向。
在Linux 一切都是文件,包括輸入和輸出。每個進(jìn)程都可以同時打開九個文件描述符。保留的文件描述符0、1、2提供shell進(jìn)程使用。
0
表示標(biāo)準(zhǔn)輸入。1
表示標(biāo)準(zhǔn)輸出。2
標(biāo)準(zhǔn)錯誤。您可以使用這些文件描述符來控制程序或者腳本的輸入和輸出。
您需要完全理解這三個概念,因?yàn)樗荢hell腳本或者程序的支柱。因此,我們將詳細(xì)描述它們中的每一個。
標(biāo)準(zhǔn)輸入
STDIN
代表標(biāo)準(zhǔn)輸入,也就是文件描述符1
,默認(rèn)為鍵盤。您可以使用重定向符號<
將指定文件作為標(biāo)準(zhǔn)輸入。
如果你將標(biāo)準(zhǔn)輸入替換為文件,重定向符號<
會將的文件數(shù)據(jù)作為標(biāo)準(zhǔn)輸入傳遞給指定的程序。
例如命令cat < archive.tar | gzip -c > archive.tar.gz
使用重定向符號<
將archive.tar
文件作為標(biāo)準(zhǔn)輸入傳遞給cat命令。
cat命令接收標(biāo)準(zhǔn)輸入后,又將archive.tar
文件內(nèi)容寫入標(biāo)準(zhǔn)輸出,最后通過管道傳遞給gzip命令進(jìn)行壓縮。
cat < archive.tar | gzip -c > archive.tar.gz
標(biāo)準(zhǔn)輸出
STDOUT
代表標(biāo)準(zhǔn)輸出,也就是文件描述符2
,默認(rèn)為屏幕。您可以使用重定向符號>>
,>
將標(biāo)準(zhǔn)輸出重定向到文件。
您可以使用重定向符號>>
將數(shù)據(jù)追加到指定文件。例如命令pwd >> log
會將pwd
命令的標(biāo)準(zhǔn)輸出追加到文件log。
而重定向符號>
則會使用標(biāo)準(zhǔn)輸出覆蓋指定文件。例如命令> filename
將會清空文件filename
。
pwd >> log
> filename
標(biāo)準(zhǔn)錯誤
ls file2 > file
命令嘗試使用重定向>
符號將標(biāo)準(zhǔn)輸出重定向到文件。如果你的計算機(jī)沒有xfile文件。
ls
命令將會打印一個錯誤ls: cannot access 'file2': No such file or directory
,這通常稱為標(biāo)準(zhǔn)錯誤STDERR
。
默認(rèn)情況下,Shell將標(biāo)準(zhǔn)錯誤發(fā)送到屏幕。如果您需要將標(biāo)準(zhǔn)錯誤重定向到日志文件,可以使用重定向符號>
/>>
重定向錯誤。
ls file2 > file
ls: cannot access 'file2': No such file or directory
重定向錯誤
正如引言所提到文件描述符2
是標(biāo)準(zhǔn)錯誤,因此我們將文件描述符2
放在重定向符號之前來重定向錯誤。
假設(shè)當(dāng)前目錄不存在文件xfile,現(xiàn)在運(yùn)行ls -l xfile 2> log
命令將會把錯誤重定向到文件log,2>
表示重定向標(biāo)準(zhǔn)錯誤。
如您所見錯誤消息并沒有打印在屏幕,而是寫入到文件,你可以運(yùn)行cat命令查看文log
文件內(nèi)容。
ls -l xfile 2> log
重定向錯誤與標(biāo)準(zhǔn)輸出
要重定向錯誤和標(biāo)準(zhǔn)輸出,您必須在每個重定向符號之前添加正確的文件描述符。在同一命令可以使用多個重定向符號來實(shí)現(xiàn)標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)錯誤的重定向。
假設(shè)當(dāng)前目錄存在文件file1,但不存在文件file2。現(xiàn)在運(yùn)行命令ls flie1 file2
將會同時產(chǎn)生標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出。
出于某種原因,你可能需要標(biāo)準(zhǔn)錯誤寫入到文件error.log,而標(biāo)準(zhǔn)輸出寫入文件access.log。
此時你就可以使用文件描述1
和重定向符號>
寫入到access.log
文件,組合之后的符號是1>
。
使用文件描述符2
和重定向符好>
送到寫入到error.log文件,組合之后的符號是2>
。因此最終的命令是ls file1 file2 2> error.log 1> access.log
。
除此之外您還可以使用&>
符號將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤重定向到同一個文件。例如命令ls file1 file2 &> log
。
ls file1 file2 2> error.log 1> access.log
ls file1 file2 &> log
永久重定向
輸出重定向有兩種方式臨時重定向和永久重定向。對于 臨時重定向 ,您可以使用>
或者>>
符號。如果您有很多數(shù)據(jù)需要重定向,您可以使用exec
命令進(jìn)行永久重定向。
永久重定向并不是真的就一直唯一類型的重定向,可以隨時使用exec
命令進(jìn)行修改。
永久重定向相當(dāng)于為進(jìn)程創(chuàng)建一個文件描述符,接下來運(yùn)行命令的標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤,標(biāo)準(zhǔn)輸入都使用同一文件描述符。
例如std.sh
腳本將會重定向exec
命令之后的所有標(biāo)準(zhǔn)輸出,也就是echo生成的標(biāo)準(zhǔn)輸出。如果運(yùn)行cat命令查看log文件,我們將看到echo命令的標(biāo)準(zhǔn)輸出。
你可以多次使用exec
命令多次重定向不同的文件描述符,例如命令exec 2> error.log
將標(biāo)準(zhǔn)錯誤重定向到文件error.log
。
std.sh
#!/bin/bash
exec 1> log #永久重定向標(biāo)準(zhǔn)輸出
echo "Permanent redirection"
echo "from a shell to a file."
echo "without redirecting every line"
exec 2> error.log #永久重定向標(biāo)準(zhǔn)錯誤
echo "Script Begining ..."
echo "Redirecting Output"
除了使用exec
命令重定向標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤。你還可以使用exec
命令重定向標(biāo)準(zhǔn)輸入。默認(rèn)的標(biāo)準(zhǔn)輸入STDIN
,也就是文件描述符1
,通常是鍵盤。
命令exec 0< log
將使用log文件作為標(biāo)準(zhǔn)輸入STDIN
,而不是默認(rèn)的鍵盤。通常Linux系統(tǒng)管理員使用這種技術(shù)來讀取日志文件進(jìn)行處理。
stdin.sh
腳本很簡單。您應(yīng)該知道如何使用read 命令獲取用戶輸入。如果將文件重定向到標(biāo)準(zhǔn)輸入STDIN
,read命令將嘗試讀取文件的內(nèi)容。
stdin.sh
#!/bin/bash
exec 0< testfile
total=1
while read line; do
echo "#$total: $line"
total=$(($total + 1))
done
nohup命令重定向標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出
有時候您可能不想看到任何輸出。我們將輸出重定向到黑洞,也就是空設(shè)備文件/dev/null。這種情況在使用nohup命令啟動后臺進(jìn)程時常見。
在使用nohup命令啟動后臺進(jìn)程時你可能見過符號2>&1
,但很少使用這種方式2> /dev/null 1> /dev/null
重定向到空設(shè)備文件/dev/null
。
其實(shí)ls -al file1 file2 2> /dev/null 1> /dev/null
和ls -al file1 file2 > /dev/null 2>&1
是不相等的命令。
2> /dev/null 1> /dev/null
是直接將標(biāo)準(zhǔn)錯誤重定向到空設(shè)備文件,而> /dev/null 2>&1
是將標(biāo)準(zhǔn)錯誤先重定向到標(biāo)準(zhǔn)輸出,然后再重定向到空設(shè)備文件。
ls -al file1 file2 2> /dev/null 1> /dev/null
ls -al file1 file2 > /dev/null 2>&1
如果2>&1
是將標(biāo)準(zhǔn)錯誤信息重定向到標(biāo)準(zhǔn)輸出,你可能會想問2>1
結(jié)果是什么,我們可以運(yùn)行命令ls -al file1 file2 2>1
來驗(yàn)證這一點(diǎn)。
運(yùn)行命令后你可能注意到當(dāng)前目錄存在文件1,運(yùn)行命令cat 1
你會發(fā)現(xiàn)標(biāo)準(zhǔn)錯誤都寫入文件1。
也就是說2>1
會將標(biāo)準(zhǔn)錯誤重定向到文件1里面,所以2>&1
中的&1
指標(biāo)準(zhǔn)輸出。
ls -al file1 file2 2>1
cat 1
ls: cannot access 'file2': No such file or directory
結(jié)論
現(xiàn)在您了解標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤以及如何重定向它們。
-
Linux
+關(guān)注
關(guān)注
87文章
11320瀏覽量
209841 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23412 -
腳本
+關(guān)注
關(guān)注
1文章
391瀏覽量
14891
發(fā)布評論請先 登錄
相關(guān)推薦
評論