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 .