cat <file.txt ¿Quién es el responsable de leer el file?

cat < file.txt 

¿Quién es el responsable de leer el file?

¿El shell lee y abre el file y luego escribe su contenido en la input estándar del command?

Para el command de shell cat <file.txt :

  1. El operador de networkingirección < hace que el shell abra file.txt para leer.
  2. El shell ejecuta el command cat , con su input estándar conectada a file.txt .
  3. El command cat lee desde su input estándar (por lo que file.txt ) y copy el contenido a su salida estándar.

Entonces, el shell es el que abre el file, pero el command cat es el que lee los datos.

Puede observar lo que sucede enumerando las llamadas al sistema realizadas por el shell y sus subprocesss. En 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 es el process del shell primario, 22703 es el cat hijo)

El command shell cat file.txt funciona de manera diferente.

  1. El shell ejecuta el command cat , pasándole un parámetro, concretamente file.txt .
  2. El progtwig cat abre file.txt para leer.
  3. El command cat lee de file.txt y copy el contenido a su salida estándar.

Estás en lo correcto. Si bien esto no importará en muchas situaciones, si el shell y el process tienen permissions diferentes, puede hacerlo.

Si el process al que llama tiene privilegios elevados (como sudo o setuid), puede usar esos privilegios para abrir files que su shell podría no tener.

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