Por que o toque cria novos arquivos?

13

Estou ciente de que o touchcomando é usado para atualizar a data da última modificação em um arquivo. Também é usado para criar um novo arquivo se o arquivo solicitado não existir no sistema de arquivos.

Como o touch (como o nome indica) deve apenas atualizar a data da última modificação, por que ele também tenta criar um novo arquivo?

É apenas um cheque escrito no código do toque ou é outra coisa que faz com que um arquivo seja criado?

Alex McCourt
fonte
Como caso de uso, eu uso touch /forcefsckpara criar um arquivo vazio chamado /forcefsckpara forçar os sistemas de arquivos a serem verificados quanto a erros na próxima reinicialização. O arquivo em si não precisa conter nada, apenas precisa existir. Sem touch, eu precisaria usar viou nanosalvar um arquivo em branco. Muito mais rápido de usar touch.
Tim
@ Tim Não há nenhuma razão real que você não possa usar >/forcefsckou printf '' >>/forcefsck(o último preservaria qualquer conteúdo existente). O que você descreve é ​​uma maneira de usar um utilitário que funciona de uma certa maneira, mas que não tem nenhuma influência real sobre por que ele foi escrito para funcionar dessa maneira.
um CVn
Se esta pergunta é sobre o design touche não como ele funciona, acho que touchviola o Princípio de Responsabilidade Única com o efeito colateral da criação de arquivo. Portanto, o "porquê" é simplesmente devido às escolhas iniciais de design que ficaram paralisadas devido à popularidade e prevalência / facilidade de uso.
George Pantazes

Respostas:

15

Usando strace touch trendimentos:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

Está no touchcódigo e eu não chamaria isso de cheque . O registro de data e hora é atualizado, abrindo o arquivo para gravação e fechando-o.

VaTo
fonte
14

touchcria um novo arquivo vazio se o arquivo não existir, porque foi para isso que ele foi projetado. O utilitário precisa conter código para lidar com esse caso especificamente. O utilitário apareceu no Unix V7 ; seu manual descreveu assim:

touch - data da atualização da última modificação de um arquivo

touchtenta definir a data modificada de cada arquivo . Isso é feito lendo um caractere do arquivo e escrevendo-o novamente. Se um ** arquivo * não existir, será feita uma tentativa de criá-lo, a menos que a -copção seja especificada.

(Não sei o que touchfez se o arquivo estivesse vazio. A chamada do sistema subjacente veio mais tarde.)

Não sei ao certo por que touchfoi projetado para fazer o arquivo existir, mas suspeito que seja por causa disso make. Por que você deseja definir o horário de modificação de um arquivo para o horário atual? Há casos em que pode ser útil definir o horário da modificação para um horário específico, mas essa capacidade veio depois, o original touchsó pode definir o horário da modificação para o horário atual. Um motivo para fazer isso é executar novamente uma makeregra que depende do arquivo.

Ou seja, suponha que você tenha um arquivo fooe um makefile que declara um comando para gerar bara partir foo. Quando você digita make bar, o comando é executado e barcriado. Se barexiste e é mais recente que foo, make barnão faz nada, porque makeassume que barjá foi gerado. No entanto, se barfor mais antigo que foo, make pensa que barnão está atualizado e precisa ser regenerado.

Mas e se as regras a serem geradas barmudarem? Então você tem duas opções:

  • rm bar; make bar
  • touch foo; make bar

Você precisaria fooexistir para gerar bar, caso contrário, o comando normalmente não funcionaria.

A terminologia “touch” também estava presente no makeutilitário: make -t barapenas fingiria executar os comandos, ou seja, definiria o tempo de modificação barpara o tempo atual sem realmente executar o comando para gerar bar(você faria isso se achasse que as alterações foonão devem afetar bar). O touchutilitário era, portanto, uma versão autônoma do make -trecurso.

Gilles 'SO- parar de ser mau'
fonte