O símbolo less than e ( <
) está abrindo o arquivo e anexando-o ao manipulador de dispositivo de entrada padrão de algum aplicativo / programa. Mas você não deu ao shell qualquer aplicativo para anexar a entrada.
Exemplo
Esses dois exemplos fazem essencialmente a mesma coisa, mas obtêm sua contribuição em duas maneiras ligeiramente diferentes.
abre o arquivo
$ cat blah.txt
hi
abre STDIN
$ cat < blah.txt
hi
Espreitando por trás da cortina
Você pode usar strace
para ver o que está acontecendo.
Quando lemos de um arquivo
open("blah.txt", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "hi\n", 65536) = 3
write(1, "hi\n", 3hi
) = 3
read(3, "", 65536) = 0
close(3) = 0
close(1) = 0
Quando lemos de STDIN (identificado como 0)
read(0, "hi\n", 65536) = 3
write(1, "hi\n", 3hi
) = 3
read(0, "", 65536) = 0
close(0) = 0
close(1) = 0
No primeiro exemplo, podemos ver que cat
abriu o arquivo e leu a partir dele, blah.txt
. Na segunda podemos ver que cat
lê o conteúdo do arquivo blah.txt
via descritor de arquivo STDIN, identificado como descritor número 0.
read(0, "hi\n", 65536) = 3