Você está correto em dizer que, quando você abre um terminal, você está usando um shell. O principal trabalho de um shell é ajudá-lo a executar programas executáveis.
Então, o que é um executável? Digite ls
e clique em retornar. Deve imprimir os arquivos no diretório atual. Agora, isso parece que o shell está executando algum tipo de comando interno chamado ls
, certo? Errado! Na verdade, está criando um novo processo Linux que executa o programa executável /usr/bin/ls
.
Então, por que escreveu a lista de arquivos no shell? Bem, o programa ls
não sabe nada sobre o shell. Na verdade, não tem idéia de onde vai gravar. O que o programador fez foi fazer o programa escrever a lista para algo chamado saída padrão . O shell então usou um truque do Linux chamado pipe para fazer a lista imprimir no terminal.
Curiosamente, o shell também pode fazer esse padrão ir para outros lugares. Por exemplo, digitar ls > /tmp/ls.out
não será impresso no terminal. Na verdade, está enviando a lista para um arquivo no diretório /tmp
. Ainda mais interessante, digitar ls | less
faz o shell iniciar o programa ls
, assim como o programa less
e canaliza o padrão de ls
para o padrão em de less
. Nenhum desses programas sabia nada sobre o shell nem, de fato, o shell sabia sobre como os programas funcionam: se o programa foi codificado da maneira padrão, tudo funcionará.
Agora, para o caso node.js
. Novamente, o shell acabou de iniciar o programa node.js
. Se você não fornecer argumentos, este programa tentará ler padrão em como less
. Como você não canalizou nada para ele, o shell apenas conectou o teclado para que qualquer coisa que você digitasse sendo enviada para node
. O shell também conectou o standard out ao terminal para que qualquer coisa que node
escreveu fosse para o terminal como vimos ls
do. O efeito líquido faz parecer que o shell agora entende JavaScript, mas não é assim. Ele realmente entende apenas a execução de programas e o redirecionamento de entrada / saída (pelo menos neste caso). É node
fazendo o JS.