Мне известно, что touch
команда используется для обновления даты последней модификации файла. Он также используется для создания нового файла, если запрошенный файл не существует в файловой системе.
Так как touch (как следует из названия) должен просто обновить дату последнего мода, почему он также пытается создать новый файл?
Это просто проверка, написанная в коде касания, или это что-то еще, что вызывает создание файла?
touch /forcefsck
для создания пустой файл,/forcefsck
который вызывается для проверки файловых систем на наличие ошибок при следующей перезагрузке. Сам файл не должен содержать ничего, он просто должен существовать. Безtouch
этого мне нужно было бы использоватьvi
илиnano
сохранить пустой файл. Гораздо быстрее в использованииtouch
.>/forcefsck
илиprintf '' >>/forcefsck
(последняя сохранит любое существующее содержимое). То, что вы описываете, - это способ использовать утилиту, которая работает определенным образом, но это не имеет никакого отношения к тому, почему она написана так.touch
скорее о дизайне , чем о том, как он работает, я думаю, что онtouch
нарушает принцип единой ответственности с побочным эффектом создания файла. Следовательно, «почему» просто связано с ранним выбором дизайна, который застрял из-за популярности и распространенности / простоты использования.Ответы:
Используя
strace touch t
урожайность:Это в
touch
коде, и я бы не назвал это проверкой . Отметка времени обновляется, открывая файл для записи, а затем просто закрывая его.источник
touch
создает новый пустой файл, если файл не существует, потому что это то, для чего он был разработан. Утилита должна содержать код для конкретного случая. Утилита появилась в Unix V7 ; его руководство описывает это так:(Я не знаю, что
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
функции.источник