Ao criar um arquivo vazio, por que alguém pode preferir 'touch file' ao ': file'?

32

Nunca percebi que você poderia fazer isso até agora:

: >> file

Parece ser funcionalmente semelhante a:

touch file

Existe alguma razão pela qual a maioria dos recursos parece preferir tocar sobre este shell embutido?

    
por Harold Fischer 25.05.2018 / 19:44

4 respostas

47

Você nem precisa usar : ; você pode apenas > file (pelo menos em bash ; outros shells podem se comportar de maneira diferente).

Em termos práticos, não há diferença real aqui (embora a minúscula sobrecarga de chamar /bin/touch seja uma coisa).

touch , no entanto, também pode ser usado para modificar os registros de data e hora em um arquivo que já existe sem alterar ou apagar o conteúdo; além disso, > file irá apagar file que já existe. Isso pode ser contornado usando >> file .

Outra diferença com touch é que você pode criar (ou atualizar o registro de data e hora) vários arquivos de uma vez (por exemplo, touch foo bar baz quux ) com uma sintaxe mais sucinta do que com redirecionamento, onde cada arquivo precisa de seu próprio redirecionamento (por exemplo, >foo >bar >baz >quux ).

Usando touch :

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Usando o redirecionamento:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
    
por 25.05.2018 / 19:49
32

Como você pode usar touch de vários arquivos de uma só vez sem digitar nenhum caractere especial extra. Isso inclui coisas como expansão de chaves, por exemplo touch file{1,2,3,4} .

Outra questão é que, quando você está escrevendo um tutorial, é importante perceber que seus leitores provavelmente não são muito versados no assunto. Um comando simples pode ser muito mais compreensível do que uma estranha combinação de caracteres que não são letras. Eu esperaria que houvesse um número de usuários de shell casuais que não sabem o que é : , pela simples razão de que ele não faz nada . Da mesma forma, para um > foo sem um comando: mesmo que você saiba o que é um redirecionamento, um redirecionamento sem uma fonte pode não ser intuitivo.

Além disso, aqui no unix.se geralmente escrevemos exemplos de comandos com um símbolo de dólar para indicar o prompt. Caracteres especiais no início da linha podem ser confundidos com isso. (Observe que existem sistemas e shells que usam > como parte do prompt padrão.)

    
por 25.05.2018 / 20:02
18

Bem, para mim, a principal razão é a legibilidade. Com touch file você sabe o que está acontecendo, até alguém que não é bem educado em scripts de shell sabe o que está acontecendo. E se não, é fácil fazer man touch e ver isto:

A FILE argument that does not exist is created empty

Com o material enigmático, como : e > , é mais difícil saber o que está acontecendo e, como não há vantagem real, não há necessidade de usá-lo.

    
por 26.05.2018 / 10:32
6

Imagine que você está em busca de um de seus antigos shell scripts dos quais você só se lembra de que algum arquivo de marcador em / tmp está sendo criado. É fácil usar todos os seus arquivos * .sh para a palavra "toque". Ganhar por dois pontos gerará muitos falsos positivos se você não souber o nome exato do arquivo a ser pesquisado.

    
por 27.05.2018 / 11:27