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.