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

33

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

: >> file

Parece ser funcionalmente semelhante a:

touch file

Existe uma razão pela qual a maioria dos recursos parece preferir o toque a esse shell embutido?

Harold Fischer
fonte
7
O formato abreviado pode estar relacionado ao shell, enquanto o toque é um comando independente. Portanto, a forma abreviada depende de qual shell você usa (e as pessoas têm fortes preferências nessa área), pois talvez nem todas elas forneçam o atalho. touchser autônomo funcionará da mesma maneira que você deve usar.
Patrick Mevzek
3
Relacionado Qual é a diferença entre touch file e> file na AU.
α 25sнιη 25/05
6
O primeiro exemplo deve ser editado para : >> fileou mesmo >> filepara que eles tenham o mesmo efeito, ou seja, NÃO destruindo o conteúdo do arquivo.
User000001
2
touchatualiza principalmente o mtime. Não esvazia um arquivo existente ao contrário >.
Rexkogitans 26/0518
2
Nenhum dos comandos "cria um arquivo vazio"; eles só terão esse resultado se o arquivo ainda não existir. Para garantir um arquivo vazio, você precisa > file.
Alexis 27/05

Respostas:

47

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

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

touchno entanto, também pode ser usado para modificar os carimbos de data e hora em um arquivo que já existe sem alterar ou apagar o conteúdo; além disso, > fileexplodirá qualquer um fileque já exista. Isso pode ser contornado usando >> file.

Outra diferença 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 o 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
DopeGhoti
fonte
6
Parece que >> filenão atualizará o tempo de modificação. Não é o que o OP está procurando, mas apenas gostaria de salientar que não parece ser uma alternativa completa ao toque.
Jesse_b 25/05
2
Como a pergunta não especifica um shell específico. Pode ser bom ressaltar que > fileno zsh é equivalente a cat > file, não : > file.
JOL
Além disso, o tcsh permite : > file, mas erra > file. Talvez a equivalência de > fileto : > fileseja limitada ao bourne shell e bash?
JOL
+1 para rigor, no entanto, note que, em diversas conchas principais (eu até acho que todos ou a maioria das conchas porque a implementação mais simples seria naturalmente fazer com que este trabalho como um efeito colateral), você pode tocar vários arquivos usando o redirecionamento shell: : >foo >barou : >>foo >>barvai toque em ambos fooe bar.
Mtraceur
Só para ser pedante por causa do contexto da questão real aqui, mas : >foo >barnão touchos arquivos; ele redirecionará a saída (nula) : para os arquivos. touchtocaria nos arquivos. (:
DopeGhoti
32

Porque você pode touchvários arquivos de uma só vez sem digitar caracteres especiais extras. 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, é bastante 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 combinação estranha de caracteres que não são da letra. Eu esperava que houvesse vários usuários casuais de shell que não sabem o que :é, pela simples razão de que ele realmente não faz nada. Da mesma forma para uma planície > foosem um comando: mesmo se você souber o que é um redirecionamento, um redirecionamento sem uma fonte pode não ser intuitivo.

Além disso, aqui no unix.se, frequentemente escrevemos exemplos de comandos com um sinal de cifrão à esquerda para indicar o prompt. Caracteres especiais no início da linha podem ser confundidos com isso. (Observe que existem sistemas e shells que são usados >como parte do prompt padrão.)

ilkkachu
fonte
4
E se o comando não for completamente compreendido, sempre haverá "toque do homem". Duvido que "man:> file" retorne qualquer coisa útil :-) Além disso, os prompts do WRT, alguns (talvez a maioria) permitem que você defina o prompt para ser o que quiser. O meu mostra o nome do sistema (porque eu uso muitos xterms remotos) e o diretório atual e é definido com cores diferentes para sistemas diferentes.
Jamesqf # 25/18
1
@jamesqf, sim. Agora, é claro, também existe help :ou o que seu shell possui para documentação. Mas isso exige reconhecer :como um comando em si, lembrar que nem tudo tem uma página de manual e, finalmente, ser capaz de encontrar :na documentação. A última parte pode ser bastante difícil. : D
ilkkachu
@ jamesqf, e sim, eu quis dizer principalmente o caractere final do prompt padrão.
Ilkkachu
1
+1 por apontar os aspectos da intuição e do não-ser-um-obscuro-construto.
Mtraceur
@ilkkachu: Sim. Encontrando dois pontos na documentação não é tão difícil: encontrar o que não é apenas a pontuação é uma questão diferente :-)
jamesqf
18

Bem, para mim, a principal razão é a legibilidade. Com touch filevocê sabe o que está acontecendo, mesmo alguém que não é totalmente instruído em scripts de shell sabe o que está acontecendo. E se não, é fácil fazer man touche ver o seguinte:

A FILE argument that does not exist is created empty

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

yo '
fonte
6

Imagine que você está procurando um de seus scripts shell antigos, dos quais você lembra apenas que algum arquivo de marcador em / tmp está sendo criado. É fácil grep todos os seus arquivos * .sh para a palavra "touch". Grepping por dois pontos resultará em muitos falsos positivos se você não souber qual nome de arquivo exato procurar.

B de C
fonte