題 為什麼我可以將事物移動到/ dev / null,儘管它是由文件表示的偽設備?


我一直在想 /dev/null 作為一個黑洞,我發送的所有數據都不會被回顯。但是這個定義存在問題。根據維基百科:

/ dev / null是一個特殊文件,而不是   目錄,所以一個人無法移動文件   使用Unix mv命令進入它。

所以按照這個定義,為什麼我可以 mv 什麼東西? 例如,我可以輕鬆地做到:

# touch oi
# mv oi /dev/null

那裡發生了什麼?


7
2018-01-25 12:21


起源


[引證需要]
它對我不起作用。你用什麼操作系統?


答案:


如果你試圖在普通用戶(不是root用戶)下將任何內容移動到/ dev / null,你將得到一個 Permission denied 因為錯誤 mv something /dev/null 實際上是想刪除 /dev/null 然後移動 something 什麼 /dev/null 是。

如果您將嘗試在root下執行此操作  刪除 /dev/null (然後移動你提供的文件)!您可以通過在根shell(在Linux上)重新引導或鍵入以下內容來恢復它: mknod /dev/null c 1 3; chmod a+w /dev/null 或者在BSD中: mknod /dev/null c 3 2; chmod a+w /dev/null


8
2018-01-25 12:48



從操作系統到操作系統,設備編號會有很大差異:對1,3適用於Linux,但不適用於bsd-unix。 - Charles Stewart
相應編輯。 - whitequark


當你這樣做:

# mv oi /dev/null

你實際上做的相當於以下

# rm /dev/null
# mv oi /dev/null

5
2018-01-25 12:40



我認為這就是解決方案,因為它會覆蓋節點 - Marcos Roriz Junior


你不能

# uname -sr
Linux 2.6.32-ARCH
# touch a
# mv a /dev/null
mv: inter-device move failed: `a' to `/dev/null'; unable to remove target: Permission denied

3
2018-01-25 12:31





/dev/null 是一個字符特殊文件,這意味著它是一個無內容文件,標記為能夠為其提供和接收字節流。這些流的情況取決於它們的設備號。在我的BSD系統上:

crw-rw-rw- 1根輪3,2月25日14:57 / dev / null

設備編號為3,2(主要編號為3,次要編號為2)。我可以創造其他 /dev/null 喜歡使用的文件 mknod /dev/nil c 3 2,其中c表示我想要一個字符特殊文件,但在BSD系統上,設備號對是動態創建的,下次啟動時可能不一樣。

要了解這些事實在實踐中如何應用:

sh-2.05b#mknod / dev / nil c 3 2
sh-2.05b #ls -l / dev / nil
crw-r  -  r-- 1根輪3,2月25日15:14 / dev / nil
sh-2.05b #echo abc> / dev / nil
sh-2.05b #cat </ dev / nil
SH-2.05b以上#

Linux使用主要 - 次要對1,3,所以 mknod /dev/null c 1 3 將在那裡重新創建您的文件。

字符特殊文件在許多方面與大多數其他文件一樣,如果您具有權限,則可以將其刪除。運用 mv 在設備文件上,就像移動常規文件一樣,這意味著您將獲得一個全新的文件,您可以通過查看inode來判斷它。例如(Mac OS這次,但所有* nixes在這裡表現相同):

海倫:tmp cas $ touch abc def
海倫:tmp cas $ ls -i1
3775141 abc
3775142 def
海倫:tmp cas $ mv abc def
海倫:tmp cas $ ls -i1
3775141 def
海倫:tmp cas $ echo clobber> def
海倫:tmp cas $ ls -i1
3775141 def

查看與文件名關聯的inode def 我使用後改變了 mv,舊的文件只是被刪除,但當我寫的輸出 echo 到名為的文件 def,inode保持不變。所以你的 mv 將失敗,可能是你不是root用戶,或者刪除文件並在路徑下放置一個新文件 /dev/null,這不是這個角色特別的用途。


2
2018-01-25 14:15



您可以使用 cp -R /dev/null /some/other/null。這符合POSIX標準(mkssoftware.com/docs/man1/cp.1.asp所以它幾乎適用於任何Unix。 - whitequark
@whitequark:編輯過,我已經解釋了mv和clobbering之間的區別。 - Charles Stewart


為什麼 mv 一個文件到 /dev/null (即使有可能)你什麼時候可以刪除它?

一定, /dev/null 更有用 並打算 作為輸出數據的目的地?


0
2018-01-25 12:25





Shell Scripting是一種常見用法:

cat somefile >/dev/null 2>&1

有時您不希望看到/顯示錯誤等。


0
2018-01-25 12:43





/ dev / null就像一個黑洞和/或一個空文件。了不起!你可以在這裡放任何東西,從那裡得到任何東西。


-1
2018-01-25 12:28