cat file.txt Quem é o responsável de ler o arquivo?

2
cat < file.txt

Quem é o responsável por ler o arquivo?

O shell lê o arquivo aberto e lê o arquivo, em seguida, grava seu conteúdo na entrada padrão do comando?

    
por faressoft 21.04.2015 / 23:14

2 respostas

5

Para o comando shell cat <file.txt :

  1. O operador de redirecionamento < faz com que o shell abra file.txt para leitura.
  2. O shell executa o comando cat , com sua entrada padrão conectada a file.txt .
  3. 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.

  1. O shell executa o comando cat , passando um parâmetro a ele, ou seja, file.txt .
  2. O programa cat abre file.txt para leitura.
  3. O comando cat lê de file.txt e copia o conteúdo para sua saída padrão.
por 22.04.2015 / 02:58
-1

Você está correto. Embora isso não importe em muitas situações, se o shell e o processo tiverem permissões diferentes, ele pode.

Se o processo que você está chamando tiver privilégios elevados (como sudo ou setuid), ele poderá usar esses privilégios para abrir arquivos que seu shell talvez não consiga.

$ sudo cat < /etc/shadow | wc
-bash: /etc/shadow: Permission denied
      0       0       0
$ sudo cat /etc/shadow | wc
     64      64    1843
    
por 22.04.2015 / 00:01