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 -f
significa ou o que faz.
-f
como opção, é apenas ignorado. Talvez mutilado através do analisador de argumentos e é isso.Respostas:
Para utilitários GNU, a documentação completa está na
info
página, onde você pode ler:Veja as páginas de manual históricas do BSD sobre toque , onde
-f
foi forçar o toque.Se você olhar para a fonte desses BSDs antigos, não houve
utimes()
chamada do sistema,touch
abriria 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 (
touch
evitaria tentar fazer isso seaccess(W_OK|R_OK)
retornasse falso ).-f
tentou 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.
touch
Implementações modernas não fazem isso. Desde então, autime()
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
touch
ainda não falha se for aprovada a-f
opçã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.fonte
-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! )-f
faz nada. Ele é mantido para compatibilidade histórica (com o BSD detouch
acordo cominfo 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 umabreak
opção de processamento fora da opção sem fazer nada.Como opção ignorada,
-f
está presente desde a primeira versão dotouch
comando 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).fonte
info
a página diz Ignorado; para compatibilidade com versões BSD do `touch '.-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).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.
fonte
Ao olhar para o comentário no código-fonte histórico , linha 22:
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:
É 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?
fonte