Por que o toque cria novos arquivos?

12

Estou ciente de que o comando touch é 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.

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

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

    
por Alex McCourt 14.05.2015 / 01:00

2 respostas

15

Usando strace touch t yields:

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

Ele está no código de touch e eu não o chamaria de check . O registro de data e hora é atualizado abrindo o arquivo para gravação e, em seguida, apenas fechando-o.

    
por 14.05.2015 / 01:10
14

touch cria um novo arquivo vazio se o arquivo não existir porque foi projetado para isso. O utilitário deve conter código para lidar com esse caso especificamente. O utilitário apareceu em Unix V7 ; o seu manual descreveu assim:

touch — update date last modified of a file

touch attempts to set the modified date of each file. This is done by reading a character from the file and writing it back. If a **file* does not exist, an attempt will be made to create it unless the -c option is specified.

(Não sei o que touch fez se o arquivo estava vazio. A chamada de sistema subjacente veio depois.)

Eu não sei ao certo por que touch foi criado para fazer o arquivo existir, mas eu suspeito que seja por causa de make . Por que você deseja definir a hora de modificação de um arquivo para a hora atual? Há casos em que pode ser útil definir a hora da modificação para uma hora específica, mas essa capacidade veio depois, a% original touch pôde definir apenas a hora da modificação para a hora atual. Uma razão para fazer isso é reexecutar uma regra make que depende do arquivo.

Ou seja, suponha que você tenha um arquivo foo e um makefile que declara um comando para gerar bar de foo . Quando você digita make bar , o comando é executado e bar é criado. Se bar existir e for mais recente que foo , make bar não fará nada, porque make assume que bar já foi gerado. No entanto, se bar for mais antigo que foo , faça pensar que bar não está atualizado e precisa ser regenerado.

Mas e se as regras para gerar bar tiverem mudado? Então você tem duas opções:

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

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

A terminologia "touch" também estava presente no make utility: make -t bar apenas fingiria executar os comandos, ou seja, definiria o tempo de modificação de bar para a hora atual sem realmente executar o comando para gerar bar (você faria isso se você pensasse que as alterações em foo não deviam afetar bar ). O utilitário touch era, portanto, uma versão independente do recurso make -t .

    
por 14.05.2015 / 01:48

Tags