Pergunta

Existe alguma diferença entre ":> arquivo" e "> arquivo"?

$ : > file.out
$ ls -l file.out
-rw-rw----   1 user    user             0 Mar 18 21:08 file.out
$ > file.out
$ ls -l  file.out
-rw-rw----   1 user    user             0 Mar 18 21:08 file.out
Foi útil?

Solução

: é o shell embutido sem operação ou nulo. Então, sim, direcioná -lo para um arquivo acaba com um arquivo vazio, assim como direcionar nada para um arquivo. Suponho que há uma sensação, na qual sua fonte é um tipo diferente de nada, mas o resultado é o mesmo. De acordo com para o guia avançado de script de bash, a "> file.out"A formulação não funcionará em alguns sistemas.

Observe que em ambos os casos (diferentemente do "Touch"), o conteúdo do arquivo será substituído por nada se o arquivo já existir.

Outras dicas

Usando : > file.out é mais portátil para não-bash. Por exemplo, o ZSH define o comando nulo padrão como cat, não : (a menos que em um modo de emulação). Se você acabar precisando fazer o script funcionar com um /bin/sh que não é bash (por exemplo, um sistema BSD, qualquer sistema operacional de código fechado ou mesmo em algumas distribuições GNU/Linux agora, onde o Dash é usado), você facilitará sua vida se usar : > file.out

De acordo com Posix, ambos funcionam, mas a versão com : aborta se o redirecionamento falhar enquanto a versão com apenas o redirecionamento retorna um status de saída diferente de zero. Neste último caso, é mais portátil usar true.

Bash só faz isso corretamente no modo POSIX.

Aliases ou funções nomeadas : Violar uma restrição POSIX no aplicativo e não é portátil.

A única diferença que consigo pensar é que você pode redefinir : via alias ou definições de função. Por exemplo, você pode querer truncar os arquivos na maioria das vezes (usando o comportamento padrão de nada :), mas os arquivos de força têm um cabeçalho padrão em alguns casos. A forma > file não pode ser redefinido.

Por exemplo:

#! /bin/bash

test -n "$ADD_COPYRIGHT" &&
  :() { echo "# Copyright (c) 2010 MyName"; echo; }

# Truncate the file to zero size, unless ADD_COPYRIGHT is set, in which case
# the file is truncated to contain only a copyright notice.
: > file

# Add content to the file
some_command >> file
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top