“:> Arquivo” vs “> arquivo”
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
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