Dlaczego dotyk tworzy nowe pliki?


13

Wiem, że touchpolecenie 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?


Jako przypadek użycia używam touch /forcefsckdo utworzenia pustego pliku wywoływanego w /forcefsckcelu 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ć. Bez touchtego musiałbym użyć vilub nanozapisać pusty plik. Znacznie szybszy w użyciu touch.
Tim

@Tim Nie ma prawdziwego powodu, którego nie można użyć >/forcefscklub printf '' >>/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.
CVn

Jeśli to pytanie dotyczy projektu, toucha nie jego działania, myślę, że touchnarusza 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.
George Pantazes 15.01.2018

Odpowiedzi:


15

Korzystanie z strace touch tplonów:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

Jest w touchkodzie i nie nazwałbym tego czekiem . Znacznik czasu jest aktualizowany poprzez otwarcie pliku do zapisu, a następnie po prostu zamknięcie.


14

touchtworzy 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:

dotknij - data ostatniej modyfikacji pliku

touchpróbuje ustawić datę modyfikacji każdego pliku . Odbywa się to poprzez odczytanie znaku z pliku i ponowne zapisanie go. Jeśli ** plik * nie istnieje, zostanie podjęta próba jego utworzenia, chyba że -czostanie określona opcja.

(Nie wiem, co touchsię stało, jeśli plik był pusty. Podstawowe wywołanie systemowe przyszło później).

Nie wiem na pewno, dlaczego touchpowstał, aby plik istniał, ale podejrzewam, że to z tego powodu make. 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ł touchmógł jedynie ustawić czas modyfikacji na bieżący czas. Powodem tego jest ponowne uruchomienie makereguły zależnej od pliku.

Oznacza to, że masz plik fooi Makefile, który deklaruje polecenie, aby wygenerować barz foo. Podczas pisania make barpolecenie jest wykonywane i bartworzone. Jeśli baristnieje i jest nowszy niż foo, make barnic nie robi, ponieważ makezakłada, że barzostał już wygenerowany. Jeśli jednak barjest starszy foo, pomyśl, że barnie jest aktualny i musi zostać zregenerowany.

Ale co, jeśli reguły generowania baruległy zmianie? Masz dwie opcje:

  • rm bar; make bar
  • touch foo; make bar

fooAby wygenerować bar, musisz istnieć, w przeciwnym razie polecenie zwykle nie działałoby.

Terminologia „dotykowa” była także obecna w makenarzędziu: make -t barudawałaby tylko, że uruchamia polecenia, to znaczy ustawiałaby czas modyfikacji barna bieżący czas bez uruchamiania polecenia generowania bar(zrobiłbyś to, gdybyś pomyślał, że zmiany, które foonie powinny mieć wpływu bar). touchNarzędzie było zatem wersja standalone z make -tfunkcji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.