Para os utilitários GNU, a documentação completa está na página info
, onde você pode ler:
-f
Ignored; for compatibility with BSD versions of 'touch'.
Veja histórico de man pages do BSD para touch , onde -f
foi forçar o toque.
Se você olhar para a origem desses BSDs antigos, não houve nenhuma chamada de sistema utimes()
, então touch
abriria o arquivo no modo leitura + escrita, leria um byte, procuraria e escreveria novamente para atualizar o último acesso e a última modificação. .
Obviamente, você precisava das permissões read e write ( touch
evitaria tentar fazer isso se access(W_OK|R_OK)
retornasse falso ). -f
tentou contornar isso por temporariamente alterando temporariamente as permissões para 0666 !
0666 significa permissão de leitura e gravação para todos. Tinha que ser assim (como com uma permissão mais restritiva como 0600 que ainda teria permitido o touch ) que poderia significar durante aquela janela curta, processos que teriam permissão de ler ou escrever para o arquivo não podia mais, quebrando a funcionalidade .
Isso significa, no entanto, que processos que não teriam acesso ao arquivo agora têm uma pequena oportunidade de abri-lo, quebrando segurança .
Isso não é uma coisa muito sensata a fazer. Implementações% touch
modernas não fazem isso. Desde então, foi introduzida a utime()
chamada do sistema , que permite alterar a modificação e o tempo de acesso separadamente sem ter que se misturar com o conteúdo dos arquivos (o que significa que também funciona com arquivos não regulares) e precisa apenas de acesso de gravação para isso.
O GNU touch
ainda não falha se passar a opção -f
, mas apenas ignora o sinalizador. Dessa forma, scripts escritos para essas versões antigas do BSD não falham quando portados para sistemas GNU. Não é muito relevante hoje em dia.