Linux命令- echo、grep 、重定向、1>&2、2>&1的介紹

来源:https://www.cnblogs.com/cyyz-le/archive/2019/08/05/11305004.html
-Advertisement-
Play Games

最近筆試遇到一道題,關於Linux命令的,題目如下 下麵兩條命令分別會有怎樣的輸出 echo hello 1>&2 |grep aaa echo hello 2>&1 |grep aaa A、兩個均輸出hello B、第一個無輸出,第二個輸出 hello C、第一個輸出hello,第二個無輸出 D、 ...


最近筆試遇到一道題,關於Linux命令的,題目如下

下麵兩條命令分別會有怎樣的輸出

echo  hello 1>&2 |grep aaa

echo  hello 2>&1 |grep aaa

A、兩個均輸出hello   B、第一個無輸出,第二個輸出 hello   C、第一個輸出hello,第二個無輸出 D、兩個均輸出hello

思考了幾分鐘,選了C。正所謂參差不齊就選C,emmm其實是瞎選的,1>&2這個知識點博主忘了,所以今天就來複習一下

echo

功能:顯示器上顯示一段文字,一般起到一個提示的作用。

參數:-b 表示刪除前面的空格
   -n 表示換行
   -t 表示水平製表符
   -v 表示垂直製表符
   -c 後面的字元將不會輸出,同一時候,輸出完畢後也不會換行
   -r 輸出回車符(可是你會發現\r前面的字元沒有了)
   -a 表示輸出一個警告聲音

[chen@localhost media]$ echo   hello
hello
[chen@localhost media]$ echo   $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/chen/.local/bin:/home/chen/bin

grep

功能:文本過濾工具,是 Linux 系統中最重要的命令之一,其功能是從文本文件或管道數據流中篩選匹配的行及數據

參數 :-n : 顯示匹配的行號及行
       -i : 不區分大小寫
       -c : 只輸出匹配的行數
       -h : 查詢多文件時不顯示文件名
       -l : 查詢多文件時, 只輸出包含匹配字元的文件名  
       -v : 顯示不包含匹配文本的所有行

[chen@localhost media]$ grep  int new1.c 
	int data;
int compare(const void *p, const void  *q) {
	int const *a = (int const *)p;
	int const *b = (int const *)q;
int show(int *p, int n) {
	int i = 0;
		printf("%d ", p[i]);
int input(int *p, int n) {
	int i = 0;
int main()
	int p[100] = { 0 };
[chen@localhost media]$ grep -n int new1.c 
8:	int data;
13:int compare(const void *p, const void  *q) {
14:	int const *a = (int const *)p;
15:	int const *b = (int const *)q;
25:int show(int *p, int n) {
26:	int i = 0;
28:		printf("%d ", p[i]);
33:int input(int *p, int n) {
34:	int i = 0;
42:int main()
44:	int p[100] = { 0 };
[chen@localhost media]$ grep -c int new1.c 
11 

重定向

定義:Linux重定向是指修改原來預設的一些東西,對原來系統命令的預設執行方式進行改變,比如說簡單的我不想看到在顯示器的輸出而是希望輸出到某一文件中就可以通過Linux重定向來進行這項工作。

重定向輸入就是讓程式使用文件而不是鍵盤來輸入,重定向輸出就是讓程式輸出至文件而不是屏幕 

I/O重定向通常與 FD 有關,shell的FD通常為10個,即 0~9;

重點:常用 FD有3個,為 0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出)

用 < 來改變讀進的數據通道(stdin),使之從指定的檔案讀進

用 > 來改變送出的數據通道(stdout, stderr),使之輸出到指定的檔案;

0 是 < 的預設值,因此 < 與 0<是一樣的;同理,> 與 1> 是一樣的;

[chen@localhost media]$ vim  file.c//創建一個空文件
[chen@localhost media]$ echo  hello >  file.c //輸出hello到空文件中
[chen@localhost media]$ cat file.c //文件就存了hello
hello
[chen@localhost media]$ > file.c //快速清空文件內容的快捷鍵就是基於這個輸出重定向來完成的 1> file.c 也是同樣的作用
[chen@localhost media]$ cat file.c //文件里的hello已經被清空
[chen@localhost media]$    

FD 2 錯誤輸出,就是當輸出錯誤時,用 2>  可以輸出錯誤的返回值 

[chen@localhost media]$ cat file.c 
[chen@localhost media]$ hello 2> file.c //將錯誤信息重定向輸出到file.c文件,而不是顯示在屏幕上
[chen@localhost media]$ cat file.c 
bash: hello: 未找到命令...
[chen@localhost media]$ 

&是文件描述符,&2 表示錯誤通道2,echo  hello 1>&2 表示hello 重定向輸出到錯誤通道2

回憶一下,我們在終端敲命令錯誤屏幕就會報錯,我們把屏幕報錯顯示的地方當成錯誤通道2就容易理解了

如果不加&2 直接 echo  hello 1>2  就變成hello 重定向輸出到2這個文件里去了,如果沒有2,系統就自動創建一個2

[chen@localhost file]$ ls
file.c
[chen@localhost file]$ echo  hello 1>&2     //hello 重定向輸出到錯誤通道2,也就是終端屏幕
hello
[chen@localhost file]$ echo  hello 1>2    //hello 重定向輸出到2這個文件中去
[chen@localhost file]$ ls 
2 file.c 
[chen@localhost file]$ cat 2 
hello
[chen@localhost file]$

講到這裡相信對重定向也有一定的理解了吧,下麵回到開頭那道題

下麵兩條命令分別會有怎樣的輸出

echo  hello 1>&2 |grep aaa

echo  hello 2>&1 |grep aaa

答:第一個輸出hello,第二個無輸出,解析如下

1>&2  將正確輸出重定向到標準錯誤2通道

2>&1  將錯誤輸出重定向到標準輸出1通道

echo  hello 1>&2 後面跟了一個 | grep aaa

| 是管道,意思就是將第一條指令的結果放到第二條指令中,管道命令右邊只處理左邊的標準正確輸出,也就是通道1

echo  hello    1>&2   將結果輸出到錯誤2通道,也就是在終端屏幕上顯示hello,而標準輸出1通道沒有值,| grep aaa 搜素左邊傳來的標準輸出通道1的結果,發現沒有aaa,所以沒有輸出,最終屏幕只顯示一個hello

echo  hello    2>&1   將錯誤返回值輸出到標準1通道,不過該語句正確,沒有錯誤,通道2也就為空,屏幕沒有顯示,| grep aaa 搜素左邊傳來的標準輸出通道1的結果,通道1有hello 但是沒有 aaa  所以沒有輸出,所以屏幕沒有顯示

再幫大家加深一下,如果換一下,改成 echo  hello    1>&2 | grep  e  和 echo  hello    2>&1 | grep  e  呢?

echo  hello    1>&2   將正確結果hello輸出到錯誤2通道,也就是在終端屏幕上顯示hello,而標準輸出1通道沒有值,| grep aaa 搜素左邊傳來的標準輸出通道1的結果,發現沒有hello,所以沒有輸出,最終屏幕只顯示一個hello

echo  hello    2>&1   將錯誤返回值輸出到標準1通道,不過該語句正確,沒有錯誤,通道2也就為空,屏幕沒有顯示,| grep aaa 搜素左邊傳來的標準輸出通道1的結果,發現有e,所以輸出hello

通道2會在屏幕上顯示,通道1不會在屏幕上顯示,記住這句話,這句話是針對管道的第一個命令,大家別誤解了,把管道命令左邊命令的通道1的值給右邊命令,右邊命令再輸出,如果正確,輸出通道1,錯誤,輸出通道2

 

這就是我對重定向  ,1>&2 , 2>&1 的理解,有什麼不對的大家也可以提出來一起討論

-------------------------------------------------------------------------------

轉載請註明出處、作者 ,謝謝

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. .Net Core的序列化方式 1.1 json.Net 常用的工具包,如Newtonsoft.Json, 它是基於json格式的序列化和反序列化的組件 json.net 有以下優點: 侵入性:可以不添加attribute,就能進行序列化操作 靈活性:可以靈活性配置,比如允許被序列化的成員自定 ...
  • NetCore的Docker部署 一、NetCore與Docker Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 。 微軟的 ...
  • DtatTable 在命名空間System.Data下,NetCore2.0及以上支持。但是2017DataTable沒有可視化工具,我也沒有深研究直接下載的VS2019。然後在網上早了個SQLHelper直接用上了。 示例代碼:https://github.com/TengshengHou/Net ...
  • 使用PictureBox和TextBox組合控制項的形式完成一個自定義的帶圖片的文本輸入框。 ...
  • 示例:ASP.NET MVC asp.net mvc已經內部實現了對配置appsettings.json文件的使用,builder預設支持熱更新。 使用示例: 假設appsettings.json內容為: { "Logging": { "LogLevel": { "Default": "Warnin ...
  • 原文地址:https://www.cnblogs.com/gracejiang/p/6109085.html 一、問題描述 OS:centos 原因是拷貝虛擬機造成的。 使用vmworkstation打開虛擬機的時候,要選擇copy而非move。 二、解決描述 網路上解決步驟各異,其實就一句話。只要 ...
  • 原文鏈接:https://blog.csdn.net/lsm135/article/details/51824132#commentBox 1、編輯 ifcfg-eth0 文件,vim 最小化安裝時沒有被安裝,需要自行安裝不描述。 [root@root123 ~]# vim /etc/sysconf ...
  • [toc] NFS 共用存儲,文件伺服器 NFS是Network File System的縮寫及網路文件系統。NFS主要功能是通過區域網絡讓不同的主機系統之間可以共用文件或目錄。NFS系統和Windows網路共用、網路驅動器類似, 只不過windows用於區域網, NFS用於企業集群架構中, 如果是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...