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
.