Para o comando shell cat <file.txt
:
- O operador de redirecionamento
<
faz com que o shell abrafile.txt
para leitura. - O shell executa o comando
cat
, com sua entrada padrão conectada afile.txt
. - O comando
cat
lê sua entrada padrão (portanto,file.txt
) e copia o conteúdo para sua saída padrão.
Portanto, o shell é o único que abre o arquivo, mas o comando cat
é o que lê os dados.
Você pode observar o que está acontecendo listando as chamadas do sistema realizadas pelo shell e seus subprocessos. No Linux:
$ strace -f sh -c 'cat <file.txt' >/dev/null
execve("/bin/sh", ["sh", "-c", "cat <file.txt"], [/* 76 vars */]) = 0
…
open("file.txt", O_RDONLY) = 3
…
dup2(3, 0) = 0
…
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbc737539d0) = 22703
[pid 22702] wait4(-1, <unfinished ...>
[pid 22703] execve("/bin/cat", ["cat"], [/* 76 vars */]) = 0
[pid 22703] read(0, "wibble"..., 32768) = 6
[pid 22703] write(1, "wibble"..., 6) = 6
[pid 22703] read(0, "", 32768) = 0
[pid 22703] close(0) = 0
[pid 22703] close(1) = 0
[pid 22703] close(2) = 0
[pid 22703] exit_group(0) = ?
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 22703
--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigreturn(0x11) = 22703
…
(22702 é o processo de shell pai, 22703 é o filho cat
)
O comando shell cat file.txt
funciona de maneira diferente.
- O shell executa o comando
cat
, passando um parâmetro a ele, ou seja,file.txt
. - O programa
cat
abrefile.txt
para leitura. - O comando
cat
lê defile.txt
e copia o conteúdo para sua saída padrão.