shell重定向介紹及使用

来源:https://www.cnblogs.com/su-root/archive/2019/03/06/10454242.html
-Advertisement-
Play Games

我們在寫腳本或用腳本時,往往會發現 > /dev/null 2>&1 這類的命令。之前都是簡單的瞭解一下,並沒有深度消化,直到自己寫腳本時,不認真寫成了2>&1 >/dev/null,導致結果出問題。下麵我通過網路給大家介紹一下: shell重定向介紹: 我們平時寫的腳本或啟動程式,某段代碼會處理外 ...


我們在寫腳本或用腳本時,往往會發現 > /dev/null 2>&1 這類的命令。之前都是簡單的瞭解一下,並沒有深度消化,直到自己寫腳本時,不認真寫成了2>&1 >/dev/null,導致結果出問題。下麵我通過網路給大家介紹一下:

shell重定向介紹:

我們平時寫的腳本或啟動程式,某段代碼會處理外部的輸入,然後將調用傳參指行命令結果輸出到屏幕或指定的位置。在互動式的腳本中,輸入來自用戶的鍵盤和滑鼠,結果輸出到用戶的屏幕或設備中。而對於某些後臺運行的啟動腳本或程式,這些都會統統寫到日誌文件里。

shell腳本也一樣,但是我們一般在使用shell命令的時候,更多地還是通過鍵盤輸入,然後在屏幕上查看命令的執行結果。如果某些情況下,我們需要將shell命令的執行結果存儲到文件中,那麼我們就需要使用輸入輸出的重定向功能。

文件描述符:

執行shell命令中,預設是從鍵盤獲得輸入,並且將結果輸出到控制臺上。但是我們可以通過更改文件描述符預設的指向,從而實現輸入輸出的重定向;比如我們將1指向文件,那麼標準的輸出就會輸出到文件中。

輸出重定向:

>或1> 重定向,會清除文件里所有以前數據,增加新數據。

>>或1>> 追加重定向,文件結尾加入內容,不會刪除已有的內容。

我們使用>或者>>對輸出進行重定向。符號的左邊表示文件描述符,如果沒有的話表示1,也就是標準輸出,符號的右邊可以是一個文件,也可以是一個輸出設備。當使用>時,會判斷右邊的文件存不存在,如果存在的話就先刪除,然後創建一個新的文件,不存在的話則直接創建。但是當使用>>進行追加時,則不會刪除原來已經存在的文件。

測試:

執行ls 001.txt 002.log之後,一共有兩種輸出,其中ls: 無法訪問002.log: 沒有那個文件或目錄是錯誤輸出,001.txt是標準輸出。

執行ls 001.txt 002.log >>a.log 將原來的標準輸出重定向到了a.log文件中,所以控制台只剩下了錯誤提示。並且當執行了追加操作時,a.log文件的內容非但沒有被清空,反而又多了一條001.txt

同理,我們也可將錯誤輸出重定向到指定文件中:

 輸入重定向:

使用<對輸入做重定向,如果符號左邊沒有寫值,那麼預設就是0。

以cat命令為例,如果cat後面沒有跟文件名的話,那它的作用就是將標準輸入(鍵入)回顯到標準輸出(屏幕)上:

利用輸入重定向,將在鍵盤上輸入的字元寫入到文件中;ctrl+c來結束輸入:

 

有時候,我們需要讀取一個文件,並寫入另一個文件,那麼我們可以利用輸入重定向:

 

神奇的事情發生了,error.log文件裡面的內容被替換成了a.log文件里的內容。那麼<<又是什麼作用呢?我們再看:

當我們輸入完cat >error.log <<bqh,然後敲下回車之後,命令並沒有結束,此時cat命令像一開始一樣,等待你給它輸入數據。然後當我們敲入end之後,cat命令就結束了。bqh之前輸入的字元都已經被寫入到了out文件中。這就是輸入分割符的作用。

高級用法:重定向綁定

>/dev/null  

這條命令的作用是將標準輸出1重定向到/dev/null中。/dev/null代表linux的空設備文件,所有往這個文件裡面寫入的內容都會丟失,俗稱“黑洞”。那麼執行了>/dev/null之後,標準輸出就會不再存在,沒有任何地方能夠找到輸出的內容。

2>&1  

這條命令用到了重定向綁定,採用&可以將兩個輸出綁定在一起。這條命令的作用是錯誤輸出將和標準輸出同用一個文件描述符,說人話就是錯誤輸出將會和標準輸出輸出到同一個地方。  

linux在執行shell命令之前,就會確定好所有的輸入輸出位置,並且從左到右依次執行重定向的命令,所以>/dev/null 2>&1的作用就是讓標準輸出重定向到/dev/null中(丟棄標準輸出),然後錯誤輸出由於重用了標準輸出的描述符,所以錯誤輸出也被定向到了/dev/null中,錯誤輸出同樣也被丟棄了。執行了這條命令之後,該條shell命令將不會輸出任何信息到控制台,也不會有任何信息輸出到文件中。

>/dev/null 2>&1 與 2>&1 >/dev/null 區別

這兩條命令貌似是等同的,但其實大為不同,linux在執行shell命令之前,就會確定好所有的輸入輸出位置,並且從左到右依次執行重定向的命令,那麼我們同樣從左到右地來分析2>&1 >/dev/null:

2>&1,將錯誤輸出綁定到標準輸出上。由於此時的標準輸出是預設值,也就是輸出到屏幕,所以錯誤輸出會輸出到屏幕,>/dev/null,將標準輸出1重定向到/dev/null中(黑洞)。

>/dev/null 2>&1 與 >/dev/null 2>/dev/null 的剖析:

那麼可能會有些人會疑問,為什麼要用重定向綁定,而不是像>/dev/null 2>/dev/null這樣子重覆一遍呢。  為了回答這個問題,我們回到剛纔介紹輸出重定向的場景。我們嘗試將標準輸出和錯誤輸出都定向到a.log文件中:

納尼?竟然出現了亂碼,這是為啥呢?這是因為採用這種寫法,標準輸出和錯誤輸出會搶占往a.log文件的管道,所以可能會導致輸出內容的時候出現缺失、覆蓋等情況。現在是出現了亂碼,有時候也有可能出現只有error信息或者只有正常信息的情況。不管怎麼說,採用這種寫法,最後的情況是無法預估很糟糕的。而且,由於a.log文件被打開了兩次,兩個文件描述符會搶占性的往文件中輸出內容,所以整體IO效率不如>/dev/null 2>&1來得高。

總而言之,在工作中用到最多的就是nohup command >/dev/null 2>&1 命令

參考資料:

1、shell中>/dev/null 2>&1

2、(輸入重定向與輸出重定向)詳細分析

3、>/dev/null 2>&1 和 2>&1 >/dev/null的區別


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

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 看《CLR via C#》第四章時,看到了類型對象指針和同步塊索引這兩個概念,不知如何解釋,查看過相關資料之後,在此記錄。 類型對象指針 《CLR via C#》中的原話: 任何時候在堆上創建對象,CLR都自動初始化內部的“類型對象指針”成員來引用 與對象對應的類型對象。 在JIT編譯器將 ...
  • 一.概述 在使用Web API時,對於開發人員來說,瞭解其各種方法可能是一項挑戰。在ASP.NET Core上,Web api 輔助工具介紹二個中間件,包括:Swashbuckle和NSwag .NET。本篇先講Swashbuckle。二者都使用Swagger規範,Swagger也稱為OpenAPI ...
  • 使用這種方式始終綁定值有問題: cbxSchool.DataSource = schoolList; cbxSchool.DisplayMember = "school_name"; cbxSchool.ValueMember = "school_id"; 選擇改變事件獲取選中值:cbxSchool ...
  • 之前有寫過"Microsoft Edge瀏覽器下載文件亂碼修複方法",發現很多情況下下載文件亂碼問題還是存在,這裡對之前內容做簡單補充,希望可以幫到大家。方法二:預設如果提示下載亂碼,我們也可以在Edge瀏覽器里選擇更多工具——使用Internet Explorer打開:同樣位置我們選擇下載文件,此... ...
  • 目錄 1. free查看記憶體使用量 2. 查看 /proc/meminfo 文件獲取物理記憶體信息 3. top命令獲取記憶體用量 1、 free查看記憶體用量命令 該命令是專門用於查看記憶體用量的專用命令,這個命令有很多參數,可以人性化的顯示記憶體的總量、使用量、剩餘量等信息。 (1) free的基本使用 ...
  • 下載安裝 1.從git官網下載一個git安裝包,官網下載地址http://www.git-scm.com/download/ 2.雙擊安裝程式,進入歡迎界面點擊【Next >】 3.閱讀協議,點擊【Next >】 4.選擇安裝位置,點擊【Next >】 5.選擇安裝組件:這裡可以使用預設選項,點擊【 ...
  • 1. 下載安裝git (windows版) 網址:https://git-scm.com/download/win 點擊for windows版本->下載 2. 點擊exe文件安裝,安裝完成後打開cmd,建立倉庫 3. 選擇一個盤創建一個文件夾隨意命名 如:E:\GIT 使用git init命令來初 ...
  • 利用系統函數模擬實現nginx 系統腳本啟動的特殊顏色專業效果/etc/init.d/nginxd {start/stop/restart/reload}利用if語句實現: 實現特殊顏色實現效果: vim start_nginx.sh 添加函數功能,實現上面的效果: vim bqh_nginx_st ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...