天天看點

淺談Linux标準輸入輸出重定向

在馮·諾依曼體系中,計算機制造有三個基本原則,他們分别是:采用二進制邏輯、程式存儲執行和計算機由五個部分組成。

而在計算機的五個部分中,便是有運算器、控制器、存儲器、輸入裝置、輸出裝置這些内容。

我們的Linux也是在基于這些内容才可以運作起來,今天就來簡單說一下關于輸入裝置與輸出裝置這些内容。

linux的标準輸入裝置指的就是我們的鍵盤,掃描器,而标準輸出裝置指的肯定是顯示器,當然也可以有其他裝置,比如列印機這一類的,但是,在标準輸出中又有一種叫标準錯誤輸出,也就是說我們的指令如果是錯誤的,他所顯示的内容也會顯示在顯示器上。

這便是我們朝夕相處的方式。

但是一些讓人覺得難以啟齒的錯誤,如果我們不想讓他顯示在螢幕上,想把他藏起來,這時候我們該怎麼辦呢?于是,便有了輸出重定向這一種功能,下面我們就來談一談關于重定向的一些小細節。

在Linux的世界中,可以說是一切皆檔案,一些裝置,比如磁盤,都是以檔案形式反映在系統中的,那鍵盤顯示器呢?

裝置 裝置名 檔案描述符 類型
鍵盤 /dev/stdin 标準輸入
顯示器 /dev/stdout 1 标準輸出
/dev/stderr 2 标準錯誤輸出

這張表上寫的便是在/dev目錄下存放的檔案裝置,鍵盤,顯示器,便是這樣被系統調用的,系統通過裝置與檔案描述符,把我們輸入的指令,與他回饋給我們的資訊進行着完美的轉換。何為檔案描述符呢?Linux系統核心利用的便是檔案描述符才能來進行檔案的通路。而檔案描述符又必須得是非負整數。在我們打開現存檔案或建立檔案時,核心會傳回一個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。這便是官方的定義。是以,檔案描述符是可以自己來設定的,但是對于Linux初始的0,1,2就已經是很好的了。那我們就來說說他的用法就OK了。

标準輸出重定向的符号是>,标準錯誤輸出重定向的符号是2>,這便是檔案描述符的用法了,其實标準輸出重定向的符号也可以是1>,隻不過我們都把他省略了,系統預設的>符号也是标準輸出重定向的符号。

那下面我們就來用指令來具體說說:

如果你輸入echo “abc”>file.txt,這條指令的意思是,建立一個檔案file.txt并且在其中輸入abc,我們之間省略了touch這一步,相當于使用了vim,這便是最基礎的用法,重定向了echo "abc"指令的輸出位置,他不再輸出到螢幕上。但是>左邊的指令不能是錯誤的,比如:echo “abc"不能變為"abc”,否則會報錯

那我們在使用同樣的指令呢?echo “def” > file.txt 這又會是什麼樣的結果呢?使用cat file.txt指令檢視,你會發現原來的abc沒有了,隻剩下剛剛添加的def了,這是因為>同時也有覆寫的意思,這裡說一個小技巧,在企業運維中,如果一個分區快被占滿了,我們知道其中的一些檔案沒用了,可以删掉用來釋放分區,我們應該删除它,這裡是不是會想使用rm指令之間删除呢?其實這樣删除的話,如果有使用者在這個檔案裡進行操作,或者有一個程式真在使用它,使用rm指令删除并不能立即釋放空間,losf | grep deleted 這條指令便是檢視那些你删除了,但卻沒有釋放空間的指令,隻要程式不在通路他,他才會釋放,那我們如果在這種情況下安全的釋放空間呢?> 檔案路徑 我們便可以使用這條指令,它用于清空檔案,我們并沒有删除它,但是它的大小已經變為0了,被覆寫了,它可以用于企業删除占大記憶體的檔案。(你也可以使用dd if=/dev/zero of=/boot/file bs=1M count=800 這條指令來做一個小實驗,在boot分區下建立檔案file,來試一試)

> 是覆寫的話,我們想在檔案裡面添加新内容就得使用>>來進行追加,這便是追加的方式,echo “def” >> file.txt 檔案裡就會出現abcdef了。你也可以使用set -C 檔案名指令禁止内容被>覆寫,但可追加,它的作用:轉向所産生的檔案無法覆寫已存在的檔案。使用set +C 檔案名來解除鎖定,但是>| 這條指令又可以強行覆寫。

回答剛開始的問題,如果一些難以啟齒的錯誤不想被别人看到,該怎麼辦呢?Linux沒有和Windows一樣的垃圾箱,删除檔案之後不可以找回,但是卻有一個向黑洞一樣的設定檔案,就是/dev/null 隻要進去的檔案,就會向進了黑洞一般,永遠的消失了,我們利用這一點 使用 指令 &> /dev/null 指令,将你的錯誤與正确輸出全部丢進去,就在螢幕上看不到他們了。當然也還有以下用法:

  • &> 結果對的和錯的都放在一起,也可以

    ls /root /data/null &> /data/f1

    這是新版的用法,一些老的運維工程師使用的都是下面這條指令

  • ls /root /data/null > /data/f1 2>&1

第二種寫法便是使用了标準錯誤輸出重定向,2>,這樣标明2>&1就是把錯誤的輸出也變為正确的輸出,就可以都丢到 /data/f1這個檔案裡了,不過也還有其他用法:

  • ls (/root;/root/null) > /data/f1 2> /data/f2 把對的和錯的分開放

    (多條指令放在小括号裡進行全部的重定向)

标準輸入重定向是這樣的符号:

< 标準輸入重定向,他與标準輸出重定向相反

它的作用就是把鍵盤輸入變成其他方式的輸出,比如檔案輸入,讓指令識别檔案。舉個例子:

cat指令内置标準輸出重定向

他會把你輸入的再原封不動的輸出來

利用這個機制,可以實作cp指令的操作

cat < file.txt > file2.txt

它是把file.txt檔案的内容輸入,然後再由cat把它輸出到file2.txt檔案中,這便是輸入重定向。

還有一些其他的小工具:

tr 轉換和删除字元

tr ‘a-z’ ‘A-Z’

就會把小寫轉換為大寫

後面可以跟以下選項:

  • -t 使括号裡的轉換規則一一對應
  • -d 把出現的字元删除
  • -c 表示取設定規則的相反規則
  • -s 壓縮連續的字元,比如aabb 輸出ab

    也可以後面加其他符号,把壓縮的字元替換為新符号

    例子:

    1+2+…+100

    echo {1…100} >bc.txt

    tr -s ‘ ’ + < bc.txt > bc1.txt

    bc < bc1.txt

    這樣就算出了1+2+…+100的和了。

繼續閱讀