將文件 mv 到 /dev/null 會破壞 dev/null
如果我這樣做:
touch file; mv file /dev/null
作為根,/dev/null
消失。ls -lad /dev/null
導致沒有這樣的文件或目錄。這會破壞依賴於/dev/null
SSH 之類的應用程序,並且可以通過執行mknod /dev/null c 1 3; chmod 666 /dev/null
. 為什麼將正常文件移動到這個特殊文件會導致 消失/dev/null
?澄清一下,這是出於測試目的,我了解該
mv
命令的工作原理。我很好奇的是為什麼ls -la /dev/null
在用正常文件替換它之前顯示預期的輸出,但之後它顯示/dev/null
不存在,即使據稱文件是通過原始mv
命令創建的並且文件命令顯示 ASCII 文本。我認為這必須是ls
命令行為與devfs
非特殊文件替換字元/特殊文件時的組合。這是在 Mac OS X 上,行為可能在其他作業系統上有所不同。
查看 mv 的原始碼,http ://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
/* * If rename fails because we're trying to cross devices, and * it's a regular file, do the copy internally; otherwise, use * cp and rm. */ if (lstat(from, &sb)) { warn("%s", from); return (1); } return (S_ISREG(sb.st_mode) ? fastcopy(from, to, &sb) : copy(from, to)); ... int fastcopy(char *from, char *to, struct stat *sbp) { ... while ((to_fd = open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)) < 0) { if (errno == EEXIST && unlink(to) == 0) continue; warn("%s", to); (void)close(from_fd); return (1); }
在第一次通過 while 循環時,
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
將因 EEXIST 而失敗。然後/dev/null
將被取消連結,並重複循環。但是正如您在評論中指出的那樣,無法在 中創建正常文件/dev
,因此在下一次通過循環時,open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
仍然會失敗。我會向 Apple 送出錯誤報告。原始碼與
mv
FreeBSD 版本基本沒有變化,但因為 OSX 的 devfs 對正常文件具有非 POSIX 行為,Apple 應該修復它們的mv
.