Quando eu era iniciante, estava faltando a parte que, quando eu estava usando a linha de comando, estava usando dois programas separados, um terminal e um shell (por exemplo, bash)
O shell é o que você provavelmente já sabe, um programa que recebe comandos ou scripts de entrada, os executa e imprime sua saída.
O terminal do outro lado é como um homem no meio entre o usuário e um programa (que geralmente é um shell como bash ou fish). O que o terminal faz é ler a entrada, por exemplo, do teclado, talvez processar essa entrada de alguma forma, e redirecioná-la para o outro programa (bash).
Além disso, isso funciona de outra forma também, quando o outro programa gera algo, que algo é redirecionado para o terminal, então é o trabalho do terminal produzir algo para a tela. Entre obtendo entrada e imprimindo isto à tela o terminal pode interpretar a entrada que está adquirindo de vários modos.
Por exemplo, se um programa gerar a seguinte sequência:
\e[0;31m some extra foobar text
O terminal emitirá para a tela "algum texto foobar extra" com letras de cor vermelha. Isso ocorre porque o terminal escolhe tratar o código estranho de uma maneira especial, código esse que indica a saída seguinte em vermelho.
Da mesma forma, quando o usuário pressiona Ctrl - C
, a única coisa especial sobre isso é que o terminal escolhe tratá-lo de uma maneira especial, não há nada de especial nessa seqüência de teclas. Especificamente, isso sugere que ele enviou o sinal de interrupção (SIGINT) para o processo que está sendo executado dentro do terminal, que é o shell. Se, nesse momento, existir algum programa que tenha sido gerado pelo shell e estiver sendo executado no primeiro plano, ele também receberá o sinal. Agora o shell tem um manipulador especial para este sinal e nada acontece. Mas a maioria dos programas tem os manipuladores padrão que, no caso do SIGINT, simplesmente saem.