首頁 > 運動

Linux中的特殊檔案——終端裝置dev

由 菜園醬 發表于 運動2021-12-07

簡介devnull的使用1)擦除標準輸出我們都知道cat $filename會輸出filename對應的檔案內容(輸出到標準輸出),而使用cat $filename >devnull則不會得到任何資訊,因為我們將本來該透過標準輸出

linux系統有幾種型別檔案

前置知識

linux中的檔案型別(ll命令顯示的檔案型別):-(普通檔案)、d(目錄檔案)、l(連結檔案)、c(字元裝置檔案)、b(塊裝置檔案)、p(管道檔案)、s(套接字檔案)。其中,cbps都是偽檔案,並不會佔用磁碟空間。

各種終端裝置

/dev/ttyS[0-3]:串列埠裝置

/dev/lp[0-3]:並口裝置

/dev/tty[0-63]:終端裝置

/dev/pts/[n]:偽終端裝置

/dev/ptyxx:偽終端裝置

/dev/vcsxx:偽終端裝置

/dev/null: 偽終端裝置

/dev/zero:偽終端裝置

/dev/console:控制檯裝置

/dev/ttyUSB*:usb裝置

/dev/pty

pty裝置主要在兩類應用中使用:網路遠端登入(ssh, rlogin, telnet)和終端模擬器(script, screen, expect)。pty是一對提供雙向通訊的字元裝置,一端為master另一端為slave,任何一端寫都可以在另外一端讀到。其中slave提供一套類似於傳統物理終端裝置的介面。如果一個程序想要與終端裝置連線,可以open slave端(據此推斷,/dev中的應該是slave端,實現在核心中供驅動呼叫的應該是master端)。由於歷史原因,linux提供了兩套偽終端api,BSD風格和System V風格(也叫做Unix98),其中在2。6。4後BSD風格已經不被推薦使用了。

/dev/null

/dev/null是什麼?

在linux中,一切皆檔案,

/dev/null,或稱空裝置,是一個特殊的裝置檔案。l

inux對檔案的讀寫,都不能由普通應用程式直接進行,需要透過工作在核心態的驅動程式來完成,/dev/null也是如此。

普通程式進入這種核心模式的入口叫系統呼叫,open和write都離不開系統呼叫。對於/dev/null檔案,在核心負責處理write呼叫的驅動程式,只是簡單地把資料都丟棄,而

讀取它則會立即得到一個EOF,

就像形成了黑洞。因此,/dev/null也被稱作“黑洞檔案”。

/dev/null的使用

1)擦除標準輸出

我們都知道

cat $filename

會輸出filename對應的檔案內容(輸出到標準輸出),

而使用

cat $filename >/dev/null

則不會得到任何資訊,因為我們將本來該透過標準輸出顯示的檔案資訊重定向到了 /dev/null 中。

cat $filename 1>/dev/null 也會得到同樣的效果,它與cat $filename >/dev/null等價。因為預設重定向的 1 就是標準輸出。

我們使用 cat $filename 時, 如果filename對應的檔案不存在,系統肯定會報錯: “ cat: No such file or directory ” 。如果我們不想看到錯誤輸出呢?我們可以禁止標準錯誤:

cat $badname 2>/dev/null

有些時候,我並不想看到任何輸出,我只想看到這條命令執行是不是正常,那麼我們可以同時禁止標準輸出和標準錯誤的輸出:

cat $filename 2>/dev/null >/dev/null

2)刪除檔案內容

有時候,我們需要刪除一些檔案的內容而不刪除檔案本身:

#cat /dev/null > /var/log/messages#> /var/log/messages#cp /dev/null > /var/log/messages

說明:> /var/log/messages與cat /dev/null > /var/log/messages等價。

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

>/dev/null 2>&1 //等同於: 1>/dev/null 2>/dev/null

解釋:&符號,後面接的必須是的檔案描述符。不能寫成2>1,這樣就成了標準錯誤重定向到檔名為1的檔案中了,而不是重定向標準錯誤到標準輸出中。所以這裡就是:標準輸出重定向到了/dev/null,而標準錯誤又重定向到了標準輸出。所以最終結果是:

標準輸出和標準錯誤都重定向到了/dev/null

2>&1 >/dev/null //等同於:2>&1 1>/dev/null

解釋:命令列的重定向什麼的,是在執行命令之前就準備好了的,而shell的解釋順序是從左至右依次進行。2>&1,而1是螢幕,所以標準錯誤重定向到螢幕,再而 1>/dev/null,即標準輸出重定向到/dev/null。所以最終結果是:

標準錯誤列印到螢幕,而標準輸出不列印到螢幕。

/dev/zero

/dev/zero

像/dev/null一樣,也是一個偽檔案,但它實際上產生連續不斷的null的流(二進位制的零流,而不是ASCII型的)。寫入它的輸出會丟失不見,/dev/zero主要的用處是用來建立一個指定長度用於初始化的空檔案,像臨時交換檔案。

/dev/tty

tty是控制檯終端,linux系統可以有63個終端(這裡的終端為直接透過顯示器的方式連線的時候使用的終端),假如我是使用的tty5,當前終端為/dev/tty、/dev/tty0、/tty/console和/dev/tty5,它們都代表的是同一個終端。

/dev/tty如果一個控制檯有一個終端的話,那麼這個檔案就是對應的當前的這個控制終端的別名。當程式開啟此檔案時,Linux會自動將它重定向到一個終端視窗(一個實體的控制檯(console)或者串列埠(serial port),也可能是一個透過網路與視窗登陸的為終端),因此該檔案對於讀取人工輸入時(例如密碼)特別有用。舉例:

#! /bin/shprintf “Enter your password: ”stty -echoread passwd1 < /dev/ttyprintf “\nEnter your password again: ”read passwd2 < /dev/ttystty echo if [ “$passwd1” = “$passwd2” ]then passwd=$passwd1 printf “\nPassword set successfully!\n”else printf “\nThe two passwords you typed do not match!\n”fi

說明:

stty(set tty) 命令是用來控制終端的,stty -echo表示關閉自動列印每個輸入字元的功能,stty echo表示恢復自動列印每個輸入字元的功能。執行上面的指令碼,在終端上並不會顯示輸入的密碼,保證了密碼的安全性。

Tags:devnull檔案Cat輸出