Wiem, że touch
polecenie służy do aktualizacji daty ostatniej modyfikacji pliku. Służy również do tworzenia nowego pliku, jeśli żądany plik nie istnieje w systemie plików.
Skoro touch (jak sama nazwa wskazuje), powinien po prostu zaktualizować datę ostatniej modyfikacji, dlaczego próbuje również utworzyć nowy plik?
Czy to tylko czek zapisany w kodzie dotyku, czy może coś innego powoduje utworzenie pliku?
touch /forcefsck
do utworzenia pustego pliku wywoływanego w/forcefsck
celu wymuszenia sprawdzenia systemów plików pod kątem błędów przy następnym ponownym uruchomieniu. Sam plik nie musi zawierać niczego, po prostu musi istnieć. Beztouch
tego musiałbym użyćvi
lubnano
zapisać pusty plik. Znacznie szybszy w użyciutouch
.>/forcefsck
lubprintf '' >>/forcefsck
(ten ostatni zachowałby wszelkie istniejące treści). To, co opisujesz, to sposób użycia narzędzia, które działa w określony sposób, ale nie ma rzeczywistego wpływu na to, dlaczego zostało napisane, aby działało w ten sposób.touch
a nie jego działania, myślę, żetouch
narusza zasadę pojedynczej odpowiedzialności ze skutkiem ubocznym tworzenia pliku. Dlatego „dlaczego” wynika po prostu z wczesnych wyborów projektowych, które utknęły z powodu popularności i rozpowszechnienia / łatwości użytkowania.Odpowiedzi:
Korzystanie z
strace touch t
plonów:Jest w
touch
kodzie i nie nazwałbym tego czekiem . Znacznik czasu jest aktualizowany poprzez otwarcie pliku do zapisu, a następnie po prostu zamknięcie.źródło
touch
tworzy nowy, pusty plik, jeśli plik nie istnieje, ponieważ właśnie do tego został przeznaczony. Program narzędziowy musi zawierać kod, aby konkretnie obsługiwać tę sprawę. Narzędzie pojawiło się w Uniksie V7 ; w instrukcji opisano go następująco:(Nie wiem, co
touch
się stało, jeśli plik był pusty. Podstawowe wywołanie systemowe przyszło później).Nie wiem na pewno, dlaczego
touch
powstał, aby plik istniał, ale podejrzewam, że to z tego powodumake
. Dlaczego chcesz ustawić czas modyfikacji pliku na aktualny czas? Są przypadki, w których przydatne może być ustawienie czasu modyfikacji na określony czas, ale ta umiejętność pojawiła się później, oryginałtouch
mógł jedynie ustawić czas modyfikacji na bieżący czas. Powodem tego jest ponowne uruchomieniemake
reguły zależnej od pliku.Oznacza to, że masz plik
foo
i Makefile, który deklaruje polecenie, aby wygenerowaćbar
zfoo
. Podczas pisaniamake bar
polecenie jest wykonywane ibar
tworzone. Jeślibar
istnieje i jest nowszy niżfoo
,make bar
nic nie robi, ponieważmake
zakłada, żebar
został już wygenerowany. Jeśli jednakbar
jest starszyfoo
, pomyśl, żebar
nie jest aktualny i musi zostać zregenerowany.Ale co, jeśli reguły generowania
bar
uległy zmianie? Masz dwie opcje:rm bar; make bar
touch foo; make bar
foo
Aby wygenerowaćbar
, musisz istnieć, w przeciwnym razie polecenie zwykle nie działałoby.Terminologia „dotykowa” była także obecna w
make
narzędziu:make -t bar
udawałaby tylko, że uruchamia polecenia, to znaczy ustawiałaby czas modyfikacjibar
na bieżący czas bez uruchamiania polecenia generowaniabar
(zrobiłbyś to, gdybyś pomyślał, że zmiany, którefoo
nie powinny mieć wpływubar
).touch
Narzędzie było zatem wersja standalone zmake -t
funkcji.źródło