Jeśli zrobię: touch file; mv file /dev/null
jako root /dev/null
znika. ls -lad /dev/null
powoduje brak takiego pliku lub katalogu. To łamie aplikacje, które zależą od /dev/null
SSH i można je rozwiązać przez wykonanie mknod /dev/null c 1 3; chmod 666 /dev/null
. Dlaczego przeniesienie zwykłego pliku do tego pliku specjalnego powoduje jego zniknięcie /dev/null
?
Aby to wyjaśnić, było to w celach testowych i rozumiem, jak mv
działa polecenie. Ciekawe, dlaczego ls -la /dev/null
przed zastąpieniem go zwykłym plikiem wyświetla oczekiwane dane wyjściowe, ale potem pokazuje, że /dev/null
nie istnieje, mimo że plik został rzekomo utworzony za pomocą oryginalnego mv
polecenia, a polecenie pliku pokazuje tekst ASCII. Myślę, że musi to być kombinacja ls
zachowania polecenia w połączeniu z sytuacją, devfs
gdy plik niespecjalny zastępuje plik znakowy / specjalny. Dotyczy to Mac OS X, zachowania mogą się różnić w innych systemach operacyjnych.
/dev/null
.rm
polecenie.devfs
jest zabawny z normalnymi plikami. Dziwne, że nie dostałeś jednak błędumv
. Co powiesz na ten sposóbtouch testfile; mv testfile /dev
:?mv
może być atomowy tylko w tym samym systemie plików.Odpowiedzi:
Patrząc na kod źródłowy mv, http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
W pierwszym przejściu przez pętlę while
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
zakończy się niepowodzeniem z EEXIST. Następnie/dev/null
zostanie odłączony, a pętla powtórzona. Ale, jak zauważyłeś w swoim komentarzu, nie można utworzyć zwykłych plików/dev
, więc przy następnym przejściu przez pętlęopen(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
nadal zawiedzie.Złożyłbym raport o błędzie w Apple.
mv
Kod źródłowy jest w większości niezmienione od wersji FreeBSD, ale ponieważ devfs OSX zawiera takie zachowanie nie-POSIX ze zwykłych plików, Apple powinno naprawić swojemv
.źródło
Przeniesienie pliku do lokalizacji już istniejącego pliku zastępuje istniejący plik. W takim przypadku
/dev/null
plik urządzenia jest zastępowany, tak jak każdy normalny plik. Aby tego uniknąć, użyj opcji-i
(interaktywne, ostrzega przed nadpisaniem) lub-n
(bez wyraźnego) dlamv
./dev/null
wykonuje swoją specjalną funkcję tylko jako wiadro bitów, a następnie urządzenie jest otwierane w takim stanie, w jakim jest. Na przykład, gdy>
używany jest operator powłoki, plik jest otwierany, a następnie obcinany (nie usuwany zastępowany, co może być tym, czego oczekiwano). Jak wspomniano przez Casey, poprawnym sposobem na usunięcie pliku jest użycierm
lub nawet użycieunlink
.źródło
Umm, ponieważ nadpisujesz specjalny plik normalnym? Czego się spodziewałeś?
dev/null
nie jest katalogiem, to plik wskazującynull
urządzenie. Kiedymv
coś do niego chcesz, usuwasz oryginał i zastępujesz go tym, co przeniosłeś:źródło
/dev/null
, że to po prostu plik, który przeniosłem.