Eu vejo que isso tem o comportamento:
[root@divinity test]# echo 0 > file.txt
[root@divinity test]# cat file.txt
0
[root@divinity test]# echo 0> file.txt
[root@divinity test]# cat file.txt
Também notei que, se eu incluir ""
, funcionará como esperado:
[root@divinity test]# echo 0""> file.txt
[root@divinity test]# cat file.txt
0
Imagino que tudo isso seja apenas parte do redirecionamento de IO, mas não entendo muito bem o que echo 0>
está fazendo.
Em
echo 0 > file.txt
, com os espaços,> file.txt
faz com que o shell redirecione a saída padrão para que ela seja gravadafile.txt
(após truncar o arquivo, se ele já existir). O restante do comando,echo 0
, é executado com os redirecionamentos em vigor.Quando um operador de redirecionamento é prefixado com um número sem aspas, sem separação, o redirecionamento se aplica ao descritor de arquivo correspondente em vez do padrão. 0 é o descritor de arquivo para entrada padrão , então
0> file.txt
redireciona a entrada padrão parafile.txt
. (1 é a saída padrão, 2 é o erro padrão.) O número é tratado como parte do operador de redirecionamento e não mais como parte dos argumentos do comando; tudo o que resta éecho
.Você pode ver isso acontecendo de forma mais óbvia se incluir mais conteúdo nos
echo
argumentos:number
aparece no segundo caso porque a saída padrão não é redirecionada.Essa variante do operador de redirecionamento é mais comumente feita com erro padrão,
2> file.txt
.Redirecionar a entrada padrão dessa maneira quebrará qualquer coisa que realmente tente ler a partir de sua entrada padrão; se você realmente deseja redirecionar a entrada padrão, enquanto permite gravações, pode fazê-lo com o
<>
operador:O descritor de arquivo zero é o fluxo de entrada. 0>filename colocará o fluxo de entrada em filename. 0 > nome do arquivo colocará 0 no arquivo nome do arquivo. Observe o espaçamento.