【Linux】數據流重定向

????????數據流重定向(redirect)由字面上的意思來看,好像就是將【數據給它定向到其他地方去】的樣子?

????????沒錯,數據流重定向就是將某個命令執行后應該要出現在屏幕上的數據,給它傳輸到其他的地方,例如文件或是設備(例如打印機之類的)。

????????這玩意兒在Linux的命令行模式下面很重要,尤其是如果我們想要將某些數據存儲下來時,就更有用了。

1.什么是數據流重定向

什么是數據流重定向?這得要由命令的執行結果談起。

一般來說,如果你要執行一個命令,通常它會是這樣的:



我們執行一個命令的時候,這個命令可能會由文件讀入數據,經過處理之后,再將數據輸出到屏
幕上。

在上圖當中,standard output 與standard error output分別代表【標準輸出(STDOUT)】與【標準錯誤輸出(STDERR)】,這兩個玩意兒默認都是輸出到屏幕上面來的

那么什么是標準輸出與標準錯誤輸出?

????????簡單地說,標準輸出指的是命令執行所返回的正確信息,而標準錯誤輸出可理解為命令執行失敗后,所返回的錯誤信息。

舉個簡單例子來說,

我們的系統默認有/etc/crontab但卻無/etc/birdsay,此時若執行【cat /etc/crontab? ?/etc/vbirdsay】這個命令時,cat會進行:

  • 標準輸出:讀取/etc/crontab后,將該文件內容顯示到屏幕上;
  • 標準錯誤輸出:因為無法找到/etc/vbirdsay,因此在屏幕上顯示錯誤信息;

不管正確或錯誤的數據都是默認輸出到屏幕上,所以屏幕當然是亂的。

那能不能通過某些機制將這兩股數據分開?

當然可以,那就是數據流重定向的功能,數據流重定向可以將standard output(簡稱stdout)與standard error output(簡稱stderr)分別傳送到其他的文件或設備,而分別傳送所用的特殊字符則如下所示:

  • 標準輸入(stdin):代碼為0,使用<或<<;
  • 標準輸出(Stdout):代碼為1,使用>或>>;
  • 標準錯誤輸出(stderr):代碼為2,使用2>或2>>;

2.標準輸出流重定向

什么是標準輸出重定向?

輸出重定向:指的是重新指定設備來代替顯示器作為新的輸出設備。

2.1.?>

[root@zaishu ~]# ls -l > x  不輸出到屏幕,輸出到文本,這就是輸出重定向;另外當指定沒有描述符的時候,默認就是標準數據流。
root@zaishu ~]# ls -l 1> x (這兩條命令的效果一樣 1就是代表標準輸出流)

范例一:觀察你的系統根目錄(/)下各目錄的文件名、權限與屬性,并記錄下來

此時屏幕會顯示出文件名信息

屏幕并無任何信息


有個新文件被建立了。
我們打開看看

怪了,屏幕怎么會完全沒有數據?這是因為原本【ll /】所顯示的數據已經被重定向到~/rootfile文件中了,這個~/rootfile的文件名可以隨便你取。

如果你執行【cat ~/rootfile】那就可以看到原本應該在屏幕上面的數據。

如果我再次執行:【ll /home > ~/rootfile】后,這個~/rootfile文件的內容變成什么呢?

?它將變成【僅有ll? /home的數據】而已。咦?原本的【ll? /】數據就不見了嗎?

是的,因為該文件的建立方式是:

  1. 該文件(本例中是~/rootfile)若不存在,系統會自動地將它建立起來。
  2. 當這個文件存在的時候,那么系統就會先將這個文件內容清空,然后再將數據寫入。
  3. 也就是若以>輸出到一個已存在的文件中,這個文件就會被覆蓋掉。

2.2.? >>?

那如果我想要將數據累加而不想要將舊的數據刪除,那該如何是好?

利用兩個大于的符號(>>)就好。

以上面的范例來說,你應該要改成【ll? >> ~/rootfile】即可。

如此一來,當

  • (1)~/rootfile不存在時系統會主動建立這個文件;
  • (2)若該文件已存在,則數據會在該文件的最下方累加進去。

我們接著上面那個例子來講講

來總結一下

3.標準錯誤流重定向?

上面談到的是標準輸出的正確數據,那如果是標準錯誤的錯誤數據?

那就通過2>及2>>,同樣是覆蓋(2>)與累加(2>>)的特性。

?stdout代碼是1而 stderr代碼是2,所以這個2>是很容易理解的,而如果僅存在>時,則代表默認的代碼1,也就是說:

  • 1>:以覆蓋的方法將【正確的數據】輸出到指定的文件或設備上;
  • 1>>:以累加的方法將【正確的數據】輸出到指定的文件或設備上;
  • 2>;以覆蓋的方法將【錯誤的數據】輸出到指定的文件或設備上;
  • 2>>;以累加的方法將【錯誤的數據】輸出到指定的文件或設備上;

要注意,【1>>】以及【2>>】中間是沒有空格的,

OK,有些概念之后讓我們繼續聊一聊這家伙怎么應用吧!

????????當你以一般身份執行find這個命令的時候,由于權限的問題可能會產生一些錯誤信息

例如執行【find /home?-name testing】時,可能會產生類似【find:/root:Permission denied】之類的信息,例如下面這個范例:

????????范例二:利用一般身份賬號查找/home下面是否有名為,bashrc的文件存在.

????????下面還有我們之前建立的賬號存在,這些賬號的根目錄你當然不能進入,所以就會有錯誤及正確數據,好了,

????????那么假如我想要將數據輸出到 list 這個文件中?

執行【find /home -name.bashrc > list】會有什么結果?

?????????呵呵,你會發現 list 里面存了剛剛那個【正確】的輸出數據,至于屏幕上還是會有錯誤的信息出現,傷腦筋。

????????如果想要將正確的與錯誤的數據分別存入不同的文件中需要怎么做?

范例三:承范例二,將stdout與stderr分別存到不同的文件中

????????注意,此時屏幕上不會出現任何信息。因為剛剛執行的結果中,有Permission 的那幾行錯誤信息都會跑到 list_error 這個文件中,至于正確的輸出數據則會存到 list_right 這個文件中。

????????這樣可以了解了嗎?如果有點混亂的話,去休息一下再回來看看吧!

4./dev/null 垃圾桶黑洞設備與特殊寫法

想象一下,如果我知道錯誤信息會發生,所以要將錯誤信息忽略掉而不顯示或存儲?

這個時候黑洞設備/dev/nul 就很重要了,這個/dev/nul可以吃掉任何導向這個設備的信息。

將上述的范例自定義

范例四:承范例三,將錯誤的數據丟棄,屏幕上顯示正確的數據.


只有 stdout 會顯示到屏幕上,stderr 被丟棄了

再想象一下,如果我要將正確與錯誤數據通通寫入同一個文件中?

這個時候就得要使用特殊的寫法了。我們同樣用下面的案例來說明:

范例五:將命令的數據全部寫入名為list 的文件中

錯誤 ,由于兩股數據同時寫入一個文件,又沒有使用特殊的語法,此時兩股數據可能會交叉寫入該文件內,造成次序的錯亂。所以雖然最終 list文件還是會產生,但是里面的數據排列就會怪怪的,而不是原本屏幕上的輸出排序。

?正確?

?正確

????????至于寫入同一個文件的特殊語法如上表所示,你可以使用2>&1也可以使用&>

4.1.&(重點)

& 是一個描述符,如果在1和2前面不加&,這個時候1和2表示的是普通文件。加了&表示的是重定向到對應的設備。 舉例:

  • 1>&2 意思是把標準輸出重定向到標準錯誤,如果是 1>2 ?表示的是將標準輸出重定向到2這個文件。
  • 2>&1 意思是把標準錯誤輸出重定向到標準輸出。如果是 2>1 ?表示的是將標準錯誤重定向到1這個文件
  • &>filename 意思是把標準輸出和標準錯誤輸出都重定向到文件filename中

5.standard input :<與<<

輸入重定向:指的是重新指定設備來代替鍵盤作為新的輸入設備;

了解了stder與stdout后,那么那個<又是什么呀?

呵呵,以最簡單的語法來說,那就是【將原本需要由鍵盤輸入的數據,改由文件內容來替換】的意思。

5.1.cat

我們先由下面的cat 命令操作來了解一下什么叫做鍵盤輸入吧!

范例六:利用cat命令來建立一個文件的簡單流程。

執行后我們輸入一些東西


這里按下[ctrl]+d來退出。



由于加入>在cat后,所以這個catfile會被主動地建立,而內容就是剛剛鍵盤上面輸入的那兩行數據了。

唔,那我能不能用純文本文件替換鍵盤的輸入,也就是說,用某個文件的內容來替換鍵盤的敲擊?可以的,如下所示:

范例七:用stdin替換鍵盤的輸入以建立新文件的簡單流程。


注意看,這兩個文件的大小會一模一樣,幾乎像是使用cp來復制一般。

????????這東西非常有幫助,尤其是用在類似mail這種命令的使用上。

理解<之后,再來則是怪可怕的<< 這個連續兩個小于的符號了,它代表的是【結束的輸入字符】的意思。

舉例來講:我要用cat直接將輸入的信息輸出到catfile中,且當由鍵盤輸入eof時,該次輸入就結束,那我可以這樣做:

輸入eof這關鍵詞,立刻就結束而不需要輸入[ctrl]+d。且文件里只有這兩行,不會存在關鍵詞那一行

看到了嗎?利用<<右側的控制字符,我們可以終止一次輸入,而不必按下[crtl]+d來結束,這對程序寫作很有幫助。

5.2.<,<<

[root@zaishu ~]# cat  /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
oracle:x:1002:1002::/home/oracle:/bin/bash
[root@zaishu ~]# cat < /etc/passwd  //將passwd內容輸給cat,cat然后將內容輸出到屏幕
root:x:0:0:root:/root:/bin/bash
...
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
oracle:x:1002:1002::/home/oracle:/bin/bash

?例2. 分界符

[root@zaishu ~]# cat << 0 //遇到0,表示跳出
> a
> b
> c
> 0
a
b
c

例3. 輸入 輸出一起用
通過重定向 將/etc/passwd 作為輸入設備,并輸出重定向到 shu.txt,最終實現將 /etc/passwd 文件中內容復制到 shu.txt 。

[root@prometheus ~]# cat < /etc/passwd > shu.txt
[root@prometheus ~]# cat shu.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
prometheus:x:998:996::/home/prometheus:/bin/bash
node_exporter:x:997:995::/home/node_exporter:/bin/bash

?6.為何要使用命令輸出重定向?

好了,那么為何要使用命令輸出重定向?

我們來說一說吧!

  • 屏幕輸出的信息很重要,而且我們需要將它存下來的時候;
  • 后臺執行中的程序,不希望它干擾屏幕正常的輸出結果時;
  • 一些系統的計劃任務命令(例如寫在/etc/crontab中的文件)的執行結果,希望它可以存下來時;
  • 一些執行命令的可能已知錯誤信息時,想以【2>? /dev/null】將它丟掉時;
  • 錯誤信息與正確信息需要分別輸出時。

·當然還有很多的功能,最簡單的就是網友們常常問到的:為何我的root 都會收到系統crontab傳來的錯誤信息?

這個東西是常見的錯誤,而如果我們已經知道這個錯誤信息是可以忽略的時候,嗯,【2> errorfile】這個功能就很重要了。了解了嗎?

例題
問:? 假設我要將echo "error message”以標準錯誤的格式來輸出,該如何處置?
答:
既然有2>&1來將2>轉到1>去,那么應該也會有1>&2吧?

????????沒錯,就是這個概念,因此你可以這樣做:

  • [dmtsai@study -]$?echo "error message" 1>&2
  • [dmtsai@study -]$?echo "error message" 2> /dev/null 1>&2

你會發現第一條有信息輸出到屏幕上,第二條則沒有信息,這表示該信息已經通過2>/dev/null丟到垃圾桶中了,可以肯定是錯誤信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44962.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[圖解]企業應用架構模式2024新譯本講解26-層超類型2

1 00:00:00,510 --> 00:00:03,030 這個時候&#xff0c;如果再次查找所有人員 2 00:00:03,040 --> 00:00:03,750 我們會發現 3 00:00:05,010 --> 00:00:06,370 這一次所有的對象 4 00:00:06,740 --> 00:00:08,690 都是來自標識映射的 5 00:00:10,540 --> 00…

VB 上位機開發

VB 上位機開發第一節 在 VB(Visual Basic)上位機開發的第一節課程中涵蓋以下基礎內容: 一、上位機開發簡介 解釋上位機的概念和作用,它是與硬件設備進行通信和控制的軟件應用程序。舉例說明上位機在工業自動化、智能家居、監控系統等領域的應用。二、VB 開發環境介紹 展示如…

2024遼寧省數學建模C題【改性生物碳對水中洛克沙胂和砷離子的吸附】原創論文分享

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2024 年遼寧省大學數學建模競賽C題改性生物碳對水中洛克沙胂和砷離子的吸附完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃…

Rubber Duck Debugging: History and Benefits 橡皮鴨調試:歷史和優勢

注&#xff1a;機翻&#xff0c;未校對。 Discover the origins of rubber duck debugging, why it works, and why it has become so popular among programmers. 了解橡皮鴨調試的起源&#xff0c;它為什么有效&#xff0c;以及為什么它在程序員中如此受歡迎。 Debugging co…

AMD CPU加 vega 顯卡運行ollama本地大模型

顯卡是VEGA56&#xff0c;這個卡代號是gfx900 雖然ollama頁面上寫著這個卡可以&#xff0c;但是實際是不可以的 報錯如下&#xff1a; levelWARN sourceamd_windows.go:97 msg"amdgpu is not supported" gpu0 gpu_typegfx900:xnack 它認為的GPU型號是 gfx900:xna…

【JavaScript】解決 JavaScript 語言報錯:Uncaught SyntaxError: Unexpected identifier

文章目錄 一、背景介紹常見場景 二、報錯信息解析三、常見原因分析1. 缺少必要的標點符號2. 使用了不正確的標識符3. 關鍵詞拼寫錯誤4. 變量名與保留字沖突 四、解決方案與預防措施1. 檢查和添加必要的標點符號2. 使用正確的標識符3. 檢查關鍵詞拼寫4. 避免使用保留字作為變量名…

全棧 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL筆記(一)

前言 閱讀本文你需要有 Next.js 基礎 React 基礎 Prisma 基礎 tailwind 基礎 MySql基礎 準備工作 打開網站 https://ui.shadcn.com/docs 這不是一個組件庫。它是可重用組件的集合&#xff0c;您可以將其復制并粘貼到應用中。 打開installation 選擇Next.js 也就是此頁面…

Python3 第十七課 -- 編程第一步

目錄 一. 前言 二. end 關鍵字 一. 前言 在前面的教程中我們已經學習了一些 Python3 的基本語法知識&#xff0c;接下來我們來嘗試一些實例。 打印字符串: print("Hello, world!") 輸出結果為&#xff1a; Hello, world! 輸出變量值&#xff1a; i 256*256…

智慧校園服務監控功能

智慧校園系統中的服務監控功能&#xff0c;扮演著維護整個校園數字化生態系統穩定與高效運作的重要角色。它如同一位全天候的守護者&#xff0c;通過實時跟蹤、分析并響應系統各層面的運行狀況&#xff0c;確保教學、管理等核心業務流程的順暢進行。 服務監控功能覆蓋了智慧校園…

開發個人Ollama-Chat--6 OpenUI

開發個人Ollama-Chat–6 OpenUI Open-webui Open WebUI 是一種可擴展、功能豐富且用戶友好的自托管 WebUI&#xff0c;旨在完全離線運行。它支持各種 LLM 運行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于總所周知的原由&#xff0c;OpenAI 的接口需要密鑰才…

知識圖譜與 LLM:微調與檢索增強生成

Midjourney 的知識圖譜聊天機器人的想法。 大型語言模型 (LLM) 的第一波炒作來自 ChatGPT 和類似的基于網絡的聊天機器人&#xff0c;這些模型在理解和生成文本方面非常出色&#xff0c;這讓人們&#xff08;包括我自己&#xff09;感到震驚。 我們中的許多人登錄并測試了它寫…

微信視頻號的視頻怎么下載到本地?快速教你下載視頻號視頻

天來說說市面上常見的微信視頻號視頻下載工具&#xff0c;教大家快速下載視頻號視頻&#xff01; 方法一&#xff1a;緩存方法 該方法來源早期視頻技術&#xff0c;因早期無法將大量視頻通過網絡存儲&#xff0c;故而會有緩存視頻文件到手機&#xff0c;其目的為了提高用戶體驗…

尚硅谷Vue3入門到實戰,最新版vue3+TypeScript前端開發教程

Vue3 編碼規范 創建vue3工程 基于vite創建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs環境下運行進行創建 按提示進行創建 用vscode打開項目 安裝依賴 源文件有src 內有main.ts App.vue 簡單分析 編寫src vue2語法在三中適用 vue2中的date metho…

UnityECS學習中問題及總結entityQuery.ToComponentDataArray和entityQuery.ToEntityArray區別

在Unity的ECS&#xff08;Entity Component System&#xff09;開發中&#xff0c;entityQuery.ToComponentDataArray<T>(Allocator.Temp) 和 entityQuery.ToEntityArray(Allocator.Temp) 是兩種不同的方法&#xff0c;用于從實體查詢中獲取數據。除了泛型參數之外&#…

【深度學習入門篇 ⑤ 】PyTorch網絡模型創建

【&#x1f34a;易編橙&#xff1a;一個幫助編程小伙伴少走彎路的終身成長社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;?o?&#xfe61; ) &#xff01; 易編橙終身成長社群創始團隊嘉賓&#xff0c;橙似錦計劃領銜成員、阿里云專家博主、騰訊云內容共創官…

git、huggingface 學術加速

1、git 有時候服務器不能直接訪問 github&#xff0c;下載代碼會很麻煩&#xff1b;安裝庫的時候&#xff0c;pip xx git 就更難了 比如&#xff0c;這次我需要安裝 unsloth&#xff0c;官方給出的腳本是&#xff1a; pip install “unsloth[cu121-torch220] githttps://git…

【python】函數重構

函數重構 函數重構pycharm函數重構步驟函數重構練習 函數重構 函數重構是指對現有函數進行修改和優化的過程。重構的目的是改善代碼的可讀性、可維護性和靈活性&#xff0c;同時保持其功能不變。函數重構通常包括以下步驟&#xff1a; 理解函數的功能和目的。了解函數的作用和…

OSPF.綜合實驗

1、首先將各個網段基于172.16.0.0 16 進行劃分 1.1、劃分為4個大區域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四個網段 劃分R4 劃分area2 劃分area3 劃分area1 2、進行IP配置 如圖使用配置指令進行配置 ip address x.x.x.x /x 并且將缺省路由…

Sortable.js板塊拖拽示例

圖例 代碼在圖片后面 點贊??關注&#x1f64f;收藏?? 頁面加載后顯示 拖拽效果 源代碼 由于js庫使用外鏈&#xff0c;所以會加載一會兒 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

【Go系列】 Go的錯誤處理

承上啟下 上一篇文章中介紹了struct和interface&#xff0c;在Go語言中&#xff0c;是沒有Class這個概念的&#xff0c;我們可以通過Struct和方法的組合&#xff0c;來實現Class。我們通過Struct嵌套來實現繼承這樣的一種機制&#xff0c;并且不用設置虛函數這樣的特殊說明。同…