cat /dev/null
é uma maneira pouco complicada de escrever um comando que não produz saída. :
ou true
são mais óbvios.
Em todos os cat /dev/null > file
, : > file
e mesmo > file
na maioria dos shells, o shell abre o arquivo com O_TRUNC no stdout, em seguida, executa o aplicativo que não produz nada, então o arquivo é fechado e deixado truncado.
No entanto, nesse caso ou ao usar a chamada de sistema truncate
, se o processo que está preenchendo esse arquivo não abri-lo com o sinalizador O_APPEND, na próxima vez que ele gravar no descritor de arquivo, ele abrirá o arquivo, ele gravará os dados no deslocamento que estava dentro do arquivo.
Como o HFS + não suporta arquivos esparsos, isso significa que o espaço antes desse deslocamento precisará ser realocado e preenchido com zeros pelo sistema.
Então, você precisa matar o aplicativo que está gravando no arquivo antes de truncá-lo. Ou você precisa garantir que o aplicativo abra o arquivo com O_APPEND
(como com >>
se estiver usando o redirecionamento de shell).
Se você quiser experimentar:
$ exec 3> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100000 Dec 16 21:32 x
Agora o fd 3 do meu shell é 100000 bytes dentro do arquivo
$ : > x
$ ls -ls x
0 -rw-r--r-- 1 me me 0 Dec 16 21:34 x
Agora o arquivo está truncado (tamanho 0, sem espaço usado no disco).
$ echo >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100001 Dec 16 21:34 x
Escrevendo 1 byte para o arquivo no deslocamento 100000, o arquivo é agora 100001 bytes grandes, os primeiros todos os zeros, usariam mais de 100k no HFS +, mas sobre apenas um bloco de disco na maioria dos sistemas de arquivos Unix
Por outro lado, com:
$ exec 3>> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r-- 1 me me 100000 Dec 16 21:35 x
$ : > x
$ echo >&3
$ ls -ls x
8 -rw-r--r-- 1 me me 1 Dec 16 21:36 x
Escrevendo 1 byte para o arquivo não no deslocamento 100000, mas no final do arquivo
por causa de O_APPEND
. O arquivo tem 1 byte e ocupa o espaço necessário
para segurar aquele byte.