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

23

De man touch:

-f     (ignored)

Mas não entendo o que se entende por 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 percebeu que ele altera os carimbos de hora, apesar de -f.

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

Pandya
fonte
2
Presumo que, -fcomo opção, é apenas ignorado. Talvez mutilado através do analisador de argumentos e é isso.
Thomas
1
(ignorado) significa que o sinalizador é ignorado, não o comando.
Fund Monica's Lawsuit

Respostas:

47

Para utilitários GNU, a documentação completa está na infopágina, onde você pode ler:

-f
Ignorado; para compatibilidade com versões BSD do `touch '.

Veja as páginas de manual históricas do BSD sobre toque , onde -ffoi forçar o toque.

Se você olhar para a fonte desses BSDs antigos, não houve utimes()chamada do sistema, touchabriria o arquivo no modo de leitura + gravação, leria um byte, procuraria novamente e escreveria novamente para atualizar o último acesso e a hora da última modificação .

Obviamente, você precisava de permissões de leitura e gravação ( touchevitaria tentar fazer isso se access(W_OK|R_OK)retornasse falso ). -ftentou contornar isso alterando temporariamente as permissões temporariamente para 0666 !

0666 significa permissão de leitura e gravação para todos. Tinha que ser de outra maneira (como com uma permissão mais restritiva como 0600 que ainda teria permitido o toque ) que poderia significar durante aquela janela curta, processos que de outra forma teriam permissão de leitura ou gravação no arquivo não poderiam mais , quebrando funcionalidade .

Isso significa, no entanto, que os processos que de outra forma não teriam acesso ao arquivo agora têm uma curta oportunidade de abri-lo, quebrando a segurança .

Isso não é uma coisa muito sensata a se fazer. touchImplementações modernas não fazem isso. Desde então, a utime()chamada do sistema foi introduzida, permitindo alterar as modificações 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 só precisa de acesso de gravação para isso.

O GNU touchainda não falha se for aprovada a -fopção, mas apenas ignora a flag. Dessa forma, os scripts escritos para essas versões antigas do BSD não falham quando transportados para os sistemas GNU. Não é muito relevante hoje em dia.

Stéphane Chazelas
fonte
3
De acordo com developer.apple.com/library/mac/documentation/Darwin/Reference/… -f ainda funciona no Mac OS X. (Mas sem dúvida existem pelo menos 57 maneiras diferentes de executar a mesma funcionalidade "melhor", usando a GUI! )
alephzero
20
O uso da GUI não é necessariamente "melhor". O objetivo do uso de scripts é automatizar coisas, o que inclui garantir que seu script seja executado sem modificação em tantos dialetos unixy quanto possível, ou pelo menos na maioria dos dialetos que você provavelmente encontrará, e é aí que esses problemas antigos e obsoletos de compatibilidade se tornam uma preocupação .
Guntram Blohm apoia Monica
@alephzero Isso ocorre porque a versão no OS X é a versão BSD, com a qual o GNU mantém compatibilidade.
Barmar 23/03
14

-ffaz nada. Ele é mantido para compatibilidade histórica (com o BSD de touchacordo 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. Supondo que este seja o coreutils do GNU, você pode ver na fonte que isso apenas faz uma breakopção de processamento fora da opção sem fazer nada.

Como opção ignorada, -festá presente desde a primeira versão do touchcomando GNU adicionada em 1992 ( veja diff ). Parece que, pelo menos no FreeBSD v9, -f"tenta (s) forçar a atualização, mesmo que as permissões de arquivo não o permitam atualmente" (como encontrado por Sukminder, obrigado).

Chris Down
fonte
2
infoa página diz Ignorado; para compatibilidade com versões BSD do `touch '.
heemayl
@ heemayl Exceto eu não consegui encontrar um BSD que parece ser enviado com um argumento "-f" para tocar, então deve ser bem antigo.
Chris Baixo
Hmm .. Acabei de verificar o manual do Coreutils , que diz: "Ignorado; para compatibilidade com versões BSD do touch".
Pandya
3
-fé / foi usado para tentar forçar a atualização, mesmo que as permissões de arquivo permitissem no BSD. Não na V10, mas na v9: freebsd.org/cgi/… (pelo menos do FreeBSD).
Runium 20/03/16
@sukminder Ace, obrigado! Vou adicionar suas informações na resposta.
Chris Baixo
12

Sempre que você vê "a opção X é ignorada" na saída --help ou em uma página de manual, isso significa: o programa aceita a opção X - você não recebe um erro de sintaxe - 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 costumava ter algum efeito, seja o que for que não é mais útil, e fazer a mesma coisa, independentemente da opção, é o comportamento de compatibilidade correto.

zwol
fonte
0

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

  22   -f                     (ignored)\n\

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

E a instrução switch para manipular opções possui 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 essa opção ignorada. Talvez exista um cenário de uso que exija a opção -f e quebre de outra forma?

Nós vemos
fonte