Qual é o uso da opção -f para 'touch'?

23

De man touch :

-f     (ignored)

Mas eu não entendo o que é ignorado .

Eu tentei seguir:

$ 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

E notou que ele altera os timestamps apesar de -f .

Então, eu quero saber o que significa -f , ou o que faz.

    
por Pandya 20.03.2016 / 12:05

4 respostas

47

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.

    
por 20.03.2016 / 12:33
14

-f não faz nada. Ele é mantido para compatibilidade histórica (com BSD touch de acordo com info touch ), para que os aplicativos que esperam que ele exista não o passem e recebam uma mensagem de erro dizendo que ele não existe. Assumindo que isso é o GNU Coreutils, você pode ver na fonte que isso faz apenas break da opção de processamento sem fazer nada.

Como uma opção ignorada, -f está presente desde a primeira versão do comando GNU touch adicionado em 1992 ( veja diff ). Parece que, pelo menos no FreeBSD v9, -f "tenta [s] forçar a atualização, mesmo que as permissões do arquivo não o permitam atualmente" (conforme encontrado pela Sukminder, obrigado).

    
por 20.03.2016 / 12:18
12

Sempre que você vê "opção X é ignorada" na saída --help ou em uma página do manual, isso significa: o programa aceita opção X - você não obtém uma sintaxe erro - mas não tem nenhum efeito. O programa faz a mesma coisa que teria feito na ausência da opção.

Como as outras respostas demonstram, isso é feito para compatibilidade com versões anteriores. Uma opção usada para ter algum efeito, o que quer que tenha feito não é mais útil, e fazer a mesma coisa, independentemente da opção, é o comportamento de compatibilidade correto.

    
por 20.03.2016 / 22:37
0

Ao analisar o comentário no código fonte histórico , linha 22:

  22   -f                     (ignored)\n\

a opção -f foi projetada para ser ignorada desde o lançamento inicial por Jim Meyering.

E a instrução switch para manipular opções tem um caso explícito (linhas 150/151) para não fazer nada:

 150         case 'f':
 151           break;

É notável o que motivou os seguintes autores desde 1992 a manter esta opção ignorada. Talvez exista um cenário de uso que requeira a opção -f e que, de outra forma, quebre?

    
por 24.03.2016 / 21:37