¿Para qué sirve la opción -f para `touch`?


23

De man touch:

-f     (ignored)

Pero no entiendo lo que se entiende por ignorado .

He intentado lo siguiente:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

Y notó que a pesar de eso cambia las marcas de tiempo -f.

Entonces, quiero saber qué -fsignifica o qué hace.


2
Supongo que -fcomo opción simplemente se ignora. Tal vez destrozado el analizador de argumentos y eso es todo.
Thomas

1
(ignorado) significa que se ignora la bandera, no el comando.
Financia la demanda de Mónica el

Respuestas:


47

Para las utilidades de GNU, la documentación completa se encuentra en la infopágina, donde puede leer:

-f
Ignorado para compatibilidad con versiones BSD de 'touch'.

Vea las páginas de manual históricas de BSD para el tacto , donde -ffue forzar el toque.

Si observa el origen de esos BSD antiguos, no hubo una utimes()llamada al sistema, por touchlo que abriría el archivo en modo de lectura + escritura, leería un byte, buscaría y volvería a escribirlo para actualizar el último acceso y la última hora de modificación .

Obviamente, necesitabas permisos de lectura y escritura ( touchevitarías intentar hacerlo si se access(W_OK|R_OK)devuelve falso ). -f¡Intenté evitarlo cambiando temporalmente los permisos temporalmente a 0666 !

0666 significa permiso de lectura y escritura para todos. Tenía que ser que, de lo contrario (como con un permiso más restrictivo como 0600 que todavía hubiera permitido el toque ), eso podría significar durante esa breve ventana, los procesos que de otro modo habrían leído o escrito permiso para el archivo ya no podrían , rompiendo la funcionalidad .

Sin embargo, eso significa que los procesos que de otro modo no tendrían acceso al archivo ahora tienen una breve oportunidad de abrirlo, lo que rompe la seguridad .

Eso no es algo muy sensato de hacer. Las touchimplementaciones modernas no hacen eso. Desde entonces, la utime()llamada al sistema se ha introducido, lo que permite cambiar la modificación y el tiempo de acceso por separado sin tener que mezclarse con el contenido de los archivos (lo que significa que también funciona con archivos no regulares) y solo necesita acceso de escritura para eso.

GNU touchaún no falla si se pasa la -fopción, pero simplemente ignora la bandera. De esa manera, los scripts escritos para esas versiones antiguas de BSD no fallan cuando se transfieren a sistemas GNU. No es muy relevante hoy en día.


3
De acuerdo con developer.apple.com/library/mac/documentation/Darwin/Reference/… -f todavía funciona en Mac OS X. (¡Pero sin duda hay al menos 57 formas diferentes de realizar la misma funcionalidad "mejor", usando la GUI! )
alephzero

20
Usar la GUI no es necesariamente "mejor". El objetivo del uso de scripts es automatizar cosas, lo que incluye garantizar que su script se ejecute sin modificaciones en tantos dialectos unixy como sea posible, o al menos en la mayoría de los dialectos que pueda encontrar, y aquí es donde estos viejos problemas de compatibilidad obsoletos se convierten en una preocupación .
Guntram Blohm apoya a Monica el

@alephzero Eso se debe a que la versión en OS X es la versión BSD, con la que GNU mantiene la compatibilidad.
Barmar

14

-fno hace nada. Se mantiene por compatibilidad histórica (con BSD touchsegún info touch), para que las aplicaciones que esperan que exista no lo pasen y reciban un mensaje de error que dice que no existe. Suponiendo que se trata de coreutils de GNU, puede ver en la fuente que esto simplemente elimina breakel cambio de procesamiento de opciones sin hacer nada.

Como una opción ignorada, -festá presente desde la primera versión del touchcomando GNU agregado en 1992 ( ver diff ). Parece que, al menos en FreeBSD v9, -f"intenta forzar la actualización, incluso si los permisos del archivo no lo permiten actualmente" (como encontró Sukminder, gracias).


2
infola página dice Ignorado; para compatibilidad con versiones BSD de 'touch'.
heemayl

@heemayl Excepto porque no pude encontrar un BSD que parece enviarse con un argumento "-f" para tocar, por lo que debe ser bastante viejo.
Chris Down

Hmm .. Acabo de consultar el manual de Coreutils , que dice: "Ignorado; por compatibilidad con versiones BSD de touch".
Pandya

3
-fse / se usó para intentar forzar la actualización incluso si los permisos de archivo lo permitieron en BSD. No en V10, pero v9: freebsd.org/cgi/… (de FreeBSD al menos).
Runium

@sukminder Ace, gracias! Agregaré su información en la respuesta.
Chris Down

12

Siempre que vea "la opción X se ignora" en --help output o en una página de manual, eso significa que el programa acepta la opción X - no obtiene un error de sintaxis - pero no tiene ningún efecto. El programa hace lo mismo que hubiera hecho en ausencia de la opción.

Como demuestran las otras respuestas, esto se hace por compatibilidad con versiones anteriores. Una opción solía tener algún efecto, lo que sea que hizo ya no es útil, y hacer lo mismo independientemente de la opción es el comportamiento de compatibilidad correcto.


0

Al mirar el comentario en el código fuente histórico , línea 22:

  22   -f                     (ignored)\n\

Se pretendía ignorar la opción -f desde el lanzamiento inicial de Jim Meyering.

Y la instrucción switch para manejar opciones tiene un caso explícito (líneas 150/151) para no hacer nada:

 150         case 'f':
 151           break;

Es notable lo que motivó a los siguientes autores desde 1992 a mantener esta opción ignorada. ¿Tal vez hay un escenario de uso que requiere la opción -f y se rompe?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.