Estou ciente de que o touch
comando é 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?
touch /forcefsck
para criar um arquivo vazio chamado/forcefsck
para 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. Semtouch
, eu precisaria usarvi
ounano
salvar um arquivo em branco. Muito mais rápido de usartouch
.>/forcefsck
ouprintf '' >>/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.touch
e não como ele funciona, acho quetouch
viola 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.Respostas:
Usando
strace touch t
rendimentos:Está no
touch
có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.fonte
touch
cria 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:(Não sei o que
touch
fez se o arquivo estivesse vazio. A chamada do sistema subjacente veio mais tarde.)Não sei ao certo por que
touch
foi projetado para fazer o arquivo existir, mas suspeito que seja por causa dissomake
. 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 originaltouch
só pode definir o horário da modificação para o horário atual. Um motivo para fazer isso é executar novamente umamake
regra que depende do arquivo.Ou seja, suponha que você tenha um arquivo
foo
e um makefile que declara um comando para gerarbar
a partirfoo
. Quando você digitamake bar
, o comando é executado ebar
criado. Sebar
existe e é mais recente quefoo
,make bar
não faz nada, porquemake
assume quebar
já foi gerado. No entanto, sebar
for mais antigo quefoo
, make pensa quebar
não está atualizado e precisa ser regenerado.Mas e se as regras a serem geradas
bar
mudarem? Então você tem duas opções:rm bar; make bar
touch foo; make bar
Você precisaria
foo
existir para gerarbar
, caso contrário, o comando normalmente não funcionaria.A terminologia “touch” também estava presente no
make
utilitário:make -t bar
apenas fingiria executar os comandos, ou seja, definiria o tempo de modificaçãobar
para o tempo atual sem realmente executar o comando para gerarbar
(você faria isso se achasse que as alteraçõesfoo
não devem afetarbar
). Otouch
utilitário era, portanto, uma versão autônoma domake -t
recurso.fonte