¿Por qué touch crea nuevos archivos?

13

Soy consciente de que el touchcomando se utiliza para actualizar la fecha de la última modificación en un archivo. También se usa para crear un nuevo archivo si el archivo solicitado no existe en el sistema de archivos.

Dado que tocar (como su nombre lo indica), debería actualizar la última fecha de modificación, ¿por qué también intenta crear un nuevo archivo?

¿Es solo un cheque escrito en el código táctil o es algo más que hace que se cree un archivo?

Alex McCourt
fuente
Como caso de uso, utilizo touch /forcefsckpara crear un archivo vacío llamado /forcefsckpara forzar a los sistemas de archivos a verificar si hay errores en el próximo reinicio. El archivo en sí no necesita contener nada, solo necesita existir. Sin esto touch, necesitaría usar vio nanoguardar un archivo en blanco. Mucho más rápido de usar touch.
Tim
@Tim No hay una razón real por la que no puedas usar >/forcefscko printf '' >>/forcefsck(esta última preservaría cualquier contenido existente). Lo que describe es una forma de usar una utilidad que funciona de cierta manera, pero que no tiene una relación real sobre por qué está escrito para funcionar de esa manera.
un CVn
Si esta pregunta es sobre el diseño touchy no sobre cómo funciona, creo que touchviola el Principio de responsabilidad única con el efecto secundario de la creación de archivos. Por lo tanto, el "por qué" se debe simplemente a las primeras opciones de diseño que se estancaron debido a la popularidad y la prevalencia / facilidad de uso.
George Pantazes

Respuestas:

15

Usando strace touch trendimientos:

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

Está en touchel código y no lo llamaría un cheque sin embargo. La marca de tiempo se actualiza al abrir el archivo para escribir y luego simplemente cerrarlo.

VaTo
fuente
14

touchcrea un nuevo archivo vacío si el archivo no existe porque para eso fue diseñado. La utilidad tiene que contener código para manejar ese caso específicamente. La utilidad apareció en Unix V7 ; su manual lo describe así:

touch - fecha de actualización última modificación de un archivo

touchintenta establecer la fecha de modificación de cada archivo . Esto se hace leyendo un personaje del archivo y volviéndolo a escribir. Si no existe un ** archivo *, se intentará crearlo a menos que -cse especifique la opción.

(No sé qué touchhizo si el archivo estaba vacío. La llamada del sistema subyacente vino después).

No estoy seguro de por qué touchfue diseñado para hacer que el archivo exista, pero sospecho que es por eso make. ¿Por qué querría establecer la hora de modificación de un archivo a la hora actual? Hay casos en los que podría ser útil establecer el tiempo de modificación en un momento en particular, pero esa capacidad llegó más tarde, el original touchsolo pudo establecer el tiempo de modificación en el tiempo actual. Una razón para hacerlo es volver a ejecutar una makeregla que depende del archivo.

Es decir, supongamos que tiene un archivo foo, y un makefile que declara un comando para generar bara partir foo. Cuando escribe make bar, el comando se ejecuta y barse crea. Si barexiste y es más nuevo que foo, make barno hace nada, porque makesupone que barya se ha generado. Sin embargo, si bares más antiguo que foo, haga pensar que barno está actualizado y necesita ser regenerado.

Pero, ¿qué pasa si las reglas para generar barhan cambiado? Entonces tienes dos opciones:

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

Tendría fooque existir para generar bar, de lo contrario el comando normalmente no funcionaría.

La terminología "táctil" también estaba presente en la makeutilidad: make -t barsolo pretendía ejecutar los comandos, es decir, establecería el tiempo de modificación baren la hora actual sin ejecutar realmente el comando para generar bar(haría esto si pensara que los cambios a foono deberían afectar bar). Por touchlo tanto, la utilidad era una versión independiente de la make -tfunción.

Gilles 'SO- deja de ser malvado'
fuente