Чому дотик створює нові файли?


13

Мені відомо, що touchкоманда використовується для оновлення дати останньої модифікації файлу. Він також використовується для створення нового файлу, якщо запитуваний файл не існує у файловій системі.

Оскільки дотик (як випливає з назви) має просто оновлювати дату останнього мода, чому він також намагається створити новий файл?

Це лише чек, записаний у коді дотику, чи це щось інше, що викликає створення файлу?


Як випадок використання, я використовую, touch /forcefsckщоб створити порожній файл, покликаний /forcefsckзмусити перевіряти файлові системи на наявність помилок при наступному перезавантаженні. Сам файл не повинен містити нічого, він просто повинен існувати. Без цього touchмені потрібно використовувати viчи nanoзберегти порожній файл. Набагато швидше використовувати touch.
Тім

@Tim Немає реальної причини, яку ви не можете використовувати >/forcefsckабо printf '' >>/forcefsck(остання зберегла б будь-який існуючий вміст). Те, що ви описуєте, - це спосіб використання утиліти, яка працює певним чином, але це не має реального відношення до того, чому написано так працювати.
CVn

Якщо це питання стосується дизайну, touchа не того, як він працює, я думаю, що це touchпорушує Принцип єдиної відповідальності з побічним ефектом створення файлів. Тому "чому" просто пояснюється раннім вибором дизайну, який застряг через популярність та поширеність / простоту використання.
Джордж Пантазес

Відповіді:


15

Використання strace touch tврожайності:

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

Він в touchкоді, і я б не називав це чеком . Позначення часу оновлюється, відкриваючи файл для запису, а потім просто закриваючи його.


14

touchстворює новий, порожній файл, якщо файл не існує, тому що це було призначено. Утиліта повинна містити код для конкретного оброблення цього випадку. Утиліта з'явилася в Unix V7 ; його керівництво описав його наступним чином:

touch - дата оновлення останньої модифікації файлу

touchспроби встановити змінену дату кожного файлу . Це робиться шляхом зчитування символу з файлу та запису його назад. Якщо ** файлу * не існує, буде зроблена спроба його створити, якщо -cне вказана опція.

(Я не знаю, що touchбуло, якщо файл був порожнім. Основний виклик системи прийшов пізніше.)

Я точно не знаю, чому touchбуло створено так, щоб файл існував, але я підозрюю, що це через make. Чому ви хочете встановити час модифікації файлу на поточний час? Бувають випадки, коли може бути корисно встановити час модифікації на певний час, але ця здатність з’явилася пізніше, оригінал touchміг лише встановити час модифікації на поточний час. Причиною цього є повторне запуск makeправила, яке залежить від файлу.

Тобто, припустимо , що у вас є файл foo, а також файл , який оголошує команду для створення barз foo. Під час введення make barкоманда виконується і barстворюється. Якщо barіснує і новіше foo, make barнічого не робить, так як makeпередбачається , що barвже були створені. Однак, якщо barвона старша foo, думайте, що barце не сучасне і потребує відновлення.

Але що робити, якщо змінити правила для генерації bar? Тоді у вас є два варіанти:

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

Вам потрібно fooіснувати для того, щоб генерувати bar, інакше команда зазвичай не працює.

Терміналогія "touch" також була присутня в makeутиліті: вона make -t barбуде робити вигляд лише, що запускає команди, тобто вона встановлює час модифікації barдо поточного часу, не фактично виконуючи команду для генерації bar(ви б це зробили, якби ви думали, що зміни не fooповинні впливати bar). Таким чином, touchутиліта була окремою версією make -tфункції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.