
我一直在查看 /dev,並偶然發現了幾個文件,包括null
.我想查看文件中的內容,所以我這樣做了hx null
,但是什麼也沒發生,並且給出了錯誤File null is not a regular file
。是什麼原因導致此訊息?
答案1
中的幾個物件/dev
是虛擬設備並由內核函數直接處理。比較常用的有:
/dev/null
:無限容量的通用水槽。用於丟棄輸出: tryecho foo >/dev/null
。讀取它會傳回一個空位元組流(立即 EOF)。/dev/zero
:無限的位元組來源0x00
。通常用作用 0 覆蓋內容的輸入。/dev/random
,/dev/urandom
: 無限的隨機位元組來源。
答案2
事實上,其他答案似乎都沒有真正回答為什麼 hx 拒絕使用 /dev/null 的問題。 hx 如此反應的原因很簡單,它被編程為為裝置檔案輸出此錯誤訊息。
從https://github.com/krpors/hx/blob/develop/editor.c#L125:
if (!S_ISREG(statbuf.st_mode)) {
fprintf(stderr, "File '%s' is not a regular file\n", filename);
exit(1);
這意味著 hx 特別拒絕處理任何非常規文件。我不認為進行此檢查有一個很好的理由 - 如果沒有它,我希望它/dev/null
可以與 hx 一起使用,因為 hx 會讀取一個空文件,並且在保存它們時對其進行的任何更新都會丟失。
(這假設https://github.com/krpors/hx/確實是海報所說的 hx 程式)
答案3
/dev/null
基本上是一種丟棄資訊的方法。
主要目的只是為了能夠將事物重新導向遺忘。
echo 'duck' > /dev/null
將抑制 給予的訊息,echo 'duck'
因為它被送到/dev/null
並因此被丟棄。
這主要在使用的命令提供您不希望看到的輸出時使用。
讀取/dev/null
立即返回文件末尾——即,它就像一個空文件。
還有其他有趣的事情,/dev
例如random
會給你隨機數據;這並不是您對「文件」的期望:)值得注意的是,這/dev/random
是從系統使用中收集的真實隨機數據(擊鍵之間的時間和類似的事情),並且該池可能會很快耗盡。/dev/urandom
給你看似隨機的數字,卻是用數學公式計算出來的。通常/dev/urandom
可以滿足您的需要,但例如非常強大的加密金鑰,它還不夠好。
您也可以讀取/dev/zero
以獲得無限的零(空)位元組流。
答案4
/dev/null
是一個字元設備文件,即設備驅動程式的介面。
該特定設備是虛擬設備(不代表真實硬體)。特製為無底垃圾桶;您可以將任何程式的輸出轉儲到其中,以防您不希望它們顯示或其他任何地方。
- 就內容而言,如果您確實嘗試過讀這個文件 (是的,就是你能閱讀),它會總是相當於一個空的0位元組長度文件。
我不知道你的hx
命令是什麼,但從你的描述我猜這是一個識別文件類型的命令按其內容。我在 GNU/Linux 系統上執行此任務時使用的命令是file
,如果發現該文件不是常規文件,它也會停止...
$ file /dev/null
/dev/null: character special
但file
命令還提供了一個-s
選項,強制它讀取......
$ file -s /dev/null
/dev/null: empty
也許您的hx
命令有一個可以使用的類似選項?
file
預設(也許你的hx
命令也是如此)不識別非常規文件的原因在-s
選項文件中有所暗示file
的手冊頁,即...
- 讀取這些文件可能會導致副作用,這些副作用有時是不想要的。
- 從 FIFO 管道中讀取會永久消耗其中的數據,您無法將已讀取的數據推回管道中。
- 從設備文件讀取會導致設備變化...
- 從磁帶設備讀取會導致磁帶頭位置移動。
- 從序列埠設備讀取會導致緩衝的輸入位元組被消耗。
- 從隨機數設備讀取會導致系統的熵池耗盡。
- 還有更多,取決於相關設備的驅動程式。
- 識別這些特殊文件按內容需要做更多的工作,但確定性卻低很多:
- 內容大小不會提前知道(或需要特殊的系統特定
ioctl()
呼叫才能取得)。 - 在很多情況下,尋求是行不通的。
- 檢測依賴文件結尾簽名的文件類型將需要通讀整個內容。
- 其中一些文件給出無窮內容。
- 內容大小不會提前知道(或需要特殊的系統特定
如果您的程式不是為處理所需的工作而設計的,那麼它可能無法識別非常規文件的內容;並作為安全預防措施中止。
- 如果程序在沒有此安全檢查的情況下繼續進行,可能會導致懸掛, A碰撞,或者更糟的是,導致系統記憶體不足;取決於相關程序的設計。
如果是這種情況,則表示您的程式有限制;而是用於file -s
識別目的。
附錄
如果你hx
是一些十六進位/二進位編輯;那麼特別是不建議用它打開您不知道的特殊文件。十六進位編輯通常預載整份文件到記憶體中進行編輯操作。
因此,如果您嘗試讓它打開一個無限內容的設備文件(如/dev/zero
或/dev/urandom
),甚至是一個大型有限設備(如/dev/sda
),它可能會將您的系統驅動到一個記憶體不足的情況,您可能需要重置整台電腦才能恢復。
您剛進行的安全檢查可能會保護您免受這種情況的影響。 (正如已經提到的:設備檔案的內容大小事先未知 - 程式無法事先確定您是否有足夠的記憶體來載入它)
如果您只是想“查看”文件的標題,無論如何;使用十六進位觀眾反而, 喜歡hexdump
(推薦),或老派od
。例如:
hexdump -C -n 512 /dev/null
(內容將為空)hexdump -C -n 512 /dev/urandom
(內容每次都是不同的亂碼)
^ 此-n 512
選項將視圖限制為前 512 個位元組。但即使你忽略了這一點,並受到無盡輸出的轟炸,你所需要做的就是按 來停止它Ctrl+C。