Fundamentalmente abaixo de um shell é um TTY. Embora não invente o que você poderia chamar de CLUI. A interface do terminal (entrada e saída de texto) é implementada no TTY enquanto o processamento de comandos é tratado pelo shell.
No DOS, isso é mais como um processador de comandos em lote, que contém arquivos .bat (ch). Enquanto no Linux um shell é uma mini linguagem de programação que também inclui estruturas de controle incorporadas.
Esse script de "login" é realmente o programa init que é carregado automaticamente pelo kernel depois de carregar seu VFS (o init pode ser incorporado ao initram ou esperar que sistemas de arquivos difíceis sejam acessíveis) e é executado antes de ttys serem carregados. Na verdade, o programa init deve então configurar os TTYs e depois carregar os serviços. O sysvinit carrega um shell de intérprete e, em seguida, usa scripts de inicialização, enquanto o systemd usa o INI como arquivos de configuração que ele chama de unidades. Um script de shell não é realmente necessário durante o processo de inicialização ou o processo de login, mas exec é.
O TTY é embutido no kernel, mas não pode interagir com o usuário. Vários comandos como um login interagem com o usuário em um TTY, mas não são tecnicamente processadores de comandos ou shells. Outros exemplos básicos existem como o botão de reset no seu roteador é tecnicamente uma maneira mínima de interagir com o sistema. Mas qualquer programa anexado a um TTY pode receber entrada e saída padrão dos comandos TTY e de processo.
Ignorando o fato de que você realmente precisa de um shell para interagir de forma significativa com o sistema, a maneira mais básica de interagir com o kernel é através de chamadas do sistema e a mais básica é a execução, que é como os argumentos do comando são transmitidos.