Почему touch создает новые файлы?

13

Мне известно, что touchкоманда используется для обновления даты последней модификации файла. Он также используется для создания нового файла, если запрошенный файл не существует в файловой системе.

Так как 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коде, и я бы не назвал это проверкой . Отметка времени обновляется, открывая файл для записи, а затем просто закрывая его.

Vato
источник
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, make считает, что barон не обновлен и нуждается в обновлении.

Но что, если правила генерации barизменились? Тогда у вас есть два варианта:

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

Вы должны были fooбы существовать, чтобы генерировать bar, иначе команда обычно не будет работать.

Термин «сенсорный» также присутствовал в makeутилите: make -t barон только притворялся, что запускал команды, то есть он устанавливал бы время модификации barна текущее время, фактически не выполняя команду для генерации bar(вы сделали бы это, если бы думали, что изменения fooне должны влиять bar) Таким образом, touchутилита была автономной версией make -tфункции.

Жиль "ТАК - прекрати быть злым"
источник