0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文了解標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤

CHANBAEK ? 來源:myfreax ? 作者:myfreax ? 2022-12-05 16:35 ? 次閱讀

您可以通過兩種方式顯示shell腳本的輸出,在屏幕上顯示輸出或者將輸出發(fā)送到文件。

在本教程中我們說明Shell腳本中必不可少的知識(shí),即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和重定向。

Linux 一切都是文件,包括輸入和輸出。每個(gè)進(jìn)程都可以同時(shí)打開九個(gè)文件描述符。保留的文件描述符0、1、2提供shell進(jìn)程使用。

0表示標(biāo)準(zhǔn)輸入。1表示標(biāo)準(zhǔn)輸出。2標(biāo)準(zhǔn)錯(cuò)誤。您可以使用這些文件描述符來控制程序或者腳本的輸入和輸出。

您需要完全理解這三個(gè)概念,因?yàn)樗荢hell腳本或者程序的支柱。因此,我們將詳細(xì)描述它們中的每一個(gè)。

標(biāo)準(zhǔn)輸入

STDIN代表標(biāo)準(zhǔn)輸入,也就是文件描述符1,默認(rèn)為鍵盤。您可以使用重定向符號(hào)<將指定文件作為標(biāo)準(zhǔn)輸入。

如果你將標(biāo)準(zhǔn)輸入替換為文件,重定向符號(hào)<會(huì)將的文件數(shù)據(jù)作為標(biāo)準(zhǔn)輸入傳遞給指定的程序。

例如命令cat < archive.tar | gzip -c > archive.tar.gz使用重定向符號(hào)<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)為屏幕。您可以使用重定向符號(hào)>>,>將標(biāo)準(zhǔn)輸出重定向到文件。

您可以使用重定向符號(hào)>>將數(shù)據(jù)追加到指定文件。例如命令pwd >> log會(huì)將pwd命令的標(biāo)準(zhǔn)輸出追加到文件log。

而重定向符號(hào)>則會(huì)使用標(biāo)準(zhǔn)輸出覆蓋指定文件。例如命令> filename將會(huì)清空文件filename。

pwd >> log
> filename

標(biāo)準(zhǔn)錯(cuò)誤

ls file2 > file命令嘗試使用重定向>符號(hào)將標(biāo)準(zhǔn)輸出重定向到文件。如果你的計(jì)算機(jī)沒有xfile文件。

ls命令將會(huì)打印一個(gè)錯(cuò)誤ls: cannot access 'file2': No such file or directory,這通常稱為標(biāo)準(zhǔn)錯(cuò)誤STDERR。

默認(rèn)情況下,Shell將標(biāo)準(zhǔn)錯(cuò)誤發(fā)送到屏幕。如果您需要將標(biāo)準(zhǔn)錯(cuò)誤重定向到日志文件,可以使用重定向符號(hào)>/>>重定向錯(cuò)誤。

ls file2 > file
ls: cannot access 'file2': No such file or directory

重定向錯(cuò)誤

正如引言所提到文件描述符2是標(biāo)準(zhǔn)錯(cuò)誤,因此我們將文件描述符2放在重定向符號(hào)之前來重定向錯(cuò)誤。

假設(shè)當(dāng)前目錄不存在文件xfile,現(xiàn)在運(yùn)行ls -l xfile 2> log命令將會(huì)把錯(cuò)誤重定向到文件log,2>表示重定向標(biāo)準(zhǔn)錯(cuò)誤。

如您所見錯(cuò)誤消息并沒有打印在屏幕,而是寫入到文件,你可以運(yùn)行cat命令查看文log文件內(nèi)容。

ls -l xfile 2> log

重定向錯(cuò)誤與標(biāo)準(zhǔn)輸出

要重定向錯(cuò)誤和標(biāo)準(zhǔn)輸出,您必須在每個(gè)重定向符號(hào)之前添加正確的文件描述符。在同一命令可以使用多個(gè)重定向符號(hào)來實(shí)現(xiàn)標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)錯(cuò)誤的重定向。

假設(shè)當(dāng)前目錄存在文件file1,但不存在文件file2?,F(xiàn)在運(yùn)行命令ls flie1 file2將會(huì)同時(shí)產(chǎn)生標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出。

出于某種原因,你可能需要標(biāo)準(zhǔn)錯(cuò)誤寫入到文件error.log,而標(biāo)準(zhǔn)輸出寫入文件access.log。

此時(shí)你就可以使用文件描述1和重定向符號(hào)>寫入到access.log文件,組合之后的符號(hào)是1>。

使用文件描述符2和重定向符好>送到寫入到error.log文件,組合之后的符號(hào)是2>。因此最終的命令是ls file1 file2 2> error.log 1> access.log

除此之外您還可以使用&>符號(hào)將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤重定向到同一個(gè)文件。例如命令ls file1 file2 &> log。

ls file1 file2 2> error.log 1> access.log
ls file1 file2 &> log

永久重定向

輸出重定向有兩種方式臨時(shí)重定向和永久重定向。對(duì)于 臨時(shí)重定向 ,您可以使用>或者>>符號(hào)。如果您有很多數(shù)據(jù)需要重定向,您可以使用exec命令進(jìn)行永久重定向。

永久重定向并不是真的就一直唯一類型的重定向,可以隨時(shí)使用exec命令進(jìn)行修改。

永久重定向相當(dāng)于為進(jìn)程創(chuàng)建一個(gè)文件描述符,接下來運(yùn)行命令的標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤,標(biāo)準(zhǔn)輸入都使用同一文件描述符。

例如std.sh腳本將會(huì)重定向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)錯(cuò)誤重定向到文件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)錯(cuò)誤
echo "Script Begining ..."
echo "Redirecting Output"

除了使用exec命令重定向標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤。你還可以使用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)錯(cuò)誤和標(biāo)準(zhǔn)輸出

有時(shí)候您可能不想看到任何輸出。我們將輸出重定向到黑洞,也就是空設(shè)備文件/dev/null。這種情況在使用nohup命令啟動(dòng)后臺(tái)進(jìn)程時(shí)常見。

在使用nohup命令啟動(dòng)后臺(tái)進(jìn)程時(shí)你可能見過符號(hào)2>&1,但很少使用這種方式2> /dev/null 1> /dev/null重定向到空設(shè)備文件/dev/null

其實(shí)ls -al file1 file2 2> /dev/null 1> /dev/nullls -al file1 file2 > /dev/null 2>&1是不相等的命令。

2> /dev/null 1> /dev/null是直接將標(biāo)準(zhǔn)錯(cuò)誤重定向到空設(shè)備文件,而> /dev/null 2>&1是將標(biāo)準(zhǔn)錯(cuò)誤先重定向到標(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)錯(cuò)誤信息重定向到標(biāo)準(zhǔn)輸出,你可能會(huì)想問2>1結(jié)果是什么,我們可以運(yùn)行命令ls -al file1 file2 2>1來驗(yàn)證這一點(diǎn)。

運(yùn)行命令后你可能注意到當(dāng)前目錄存在文件1,運(yùn)行命令cat 1你會(huì)發(fā)現(xiàn)標(biāo)準(zhǔn)錯(cuò)誤都寫入文件1。

也就是說2>1會(huì)將標(biāo)準(zhǔn)錯(cuò)誤重定向到文件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)錯(cuò)誤以及如何重定向它們。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207905
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    359

    瀏覽量

    23192
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    382

    瀏覽量

    14761
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言基礎(chǔ)知識(shí)(2)--標(biāo)準(zhǔn)輸入輸出

    printf是C語言的標(biāo)準(zhǔn)輸出函數(shù),般用于向標(biāo)準(zhǔn)輸出設(shè)備按規(guī)定格式輸出信息。
    的頭像 發(fā)表于 06-12 14:21 ?4637次閱讀
    C語言基礎(chǔ)知識(shí)(2)--<b class='flag-5'>標(biāo)準(zhǔn)</b><b class='flag-5'>輸入輸出</b>

    真假電工的四個(gè)標(biāo)準(zhǔn),定要記住.#電工知識(shí)

    標(biāo)準(zhǔn)電工基礎(chǔ)
    學(xué)習(xí)電子知識(shí)
    發(fā)布于 :2022年10月13日 19:56:35

    #PLC 設(shè)計(jì)PLC程序標(biāo)準(zhǔn)步驟.

    plc標(biāo)準(zhǔn)C程序
    學(xué)習(xí)電子知識(shí)
    發(fā)布于 :2022年10月25日 15:07:18

    ISO15693中標(biāo)準(zhǔn)

    ISO15693中標(biāo)準(zhǔn)ISO (the International Organisation for Standardization) and IEC (the International
    發(fā)表于 11-25 11:57

    EMC標(biāo)準(zhǔn)了解

    般是用于民用,室內(nèi)環(huán)境的產(chǎn)品。ClassI是指3Pin輸入,帶保護(hù)接地的產(chǎn)品。ClassII是指2Pin輸入,不帶保護(hù)接地的產(chǎn)品。 4,經(jīng)常申請(qǐng)的EMC標(biāo)準(zhǔn)有那些?(按出口地區(qū)分) 1,歐盟常用的
    發(fā)表于 07-28 13:47

    【測試之王LabVIEW】標(biāo)準(zhǔn)錯(cuò)誤輸入(standard error in)

    打開即時(shí)幫助(context help),將鼠標(biāo)移動(dòng)到帶錯(cuò)誤輸入/輸出(error in/out)的節(jié)點(diǎn)(node)上,點(diǎn)擊詳細(xì)幫助信息(detailed help)查看LabVIEW幫助
    發(fā)表于 11-25 11:08

    標(biāo)準(zhǔn)IO的介紹

    緩沖行緩沖:當(dāng)在輸入輸出中遇到換行符('\n')時(shí),進(jìn)行IO操作,當(dāng)流和個(gè)終端相關(guān)聯(lián)時(shí),典型的行緩沖無緩沖:數(shù)據(jù)直接寫入文件,流不進(jìn)行緩沖,常見的錯(cuò)誤
    發(fā)表于 04-26 09:53

    Shell標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)錯(cuò)誤概述

    Shell標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤 devnull 2&1
    發(fā)表于 07-15 15:28

    詳解EMC標(biāo)準(zhǔn)結(jié)構(gòu)和分類

    大家都知道款產(chǎn)品的研發(fā)到落地都需要進(jìn)行測試認(rèn)證,EMC標(biāo)準(zhǔn)和認(rèn)證這個(gè)里面的門道很多,該如何理解EMC標(biāo)準(zhǔn)結(jié)構(gòu)和分類,EMC標(biāo)準(zhǔn)怎么針對(duì)不同產(chǎn)品進(jìn)行不同的認(rèn)證
    發(fā)表于 10-21 14:43

    解讀HEVC視頻標(biāo)準(zhǔn)的環(huán)內(nèi)濾波,看完你就懂了

    解讀HEVC視頻標(biāo)準(zhǔn)的環(huán)內(nèi)濾波,看完你就懂了
    發(fā)表于 06-03 06:08

    醫(yī)用 PCB 組裝: 了解這些法規(guī)和標(biāo)準(zhǔn)

    長壽命的醫(yī)療設(shè)備。了解設(shè)備的常見故障點(diǎn)并設(shè)計(jì)個(gè)健壯的產(chǎn)品可以提高設(shè)備的使用壽命。醫(yī)用多氯聯(lián)苯組裝標(biāo)準(zhǔn)和規(guī)范概述:醫(yī)療設(shè)備用于各種醫(yī)療保健目的,如監(jiān)測,診斷,外科手術(shù)程序等。這些設(shè)計(jì)的法規(guī)要求非常嚴(yán)格。但是
    發(fā)表于 03-17 19:17

    關(guān)于WinAVR-20060421中的標(biāo)準(zhǔn)輸入輸出

    WinAVR20060421對(duì)標(biāo)準(zhǔn)輸入輸出對(duì)象連接設(shè)備的形勢進(jìn)行了改進(jìn),導(dǎo)致本書中多個(gè)例子在WinAVR20060421中無法編譯。下面先解釋新版本中標(biāo)準(zhǔn)
    發(fā)表于 07-02 17:21 ?35次下載

    解析C語言入門基礎(chǔ)之輸入輸出

    scanf則用來從標(biāo)準(zhǔn)輸入中讀取信息。 那么什么是標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出呢? 在Linux中進(jìn)程通常
    的頭像 發(fā)表于 05-31 14:05 ?3635次閱讀

    詳解pcb漲縮標(biāo)準(zhǔn)是多少

    詳解pcb漲縮標(biāo)準(zhǔn)是多少
    的頭像 發(fā)表于 10-12 10:36 ?3144次閱讀

    詳解pcb線路板的ipc標(biāo)準(zhǔn)

    詳解pcb線路板的ipc標(biāo)準(zhǔn)
    的頭像 發(fā)表于 12-15 14:47 ?6347次閱讀