Quais são exatamente os passos desde o momento em que inicio o pseudoterminal (CTRL+ALT+T) até o momento em que o shell começa a escutar a entrada do teclado?
Eu sei que isso acontece basicamente da seguinte maneira: o processo do terminal chama dev/pts/ptmx
, então o lado escravo é criado (por exemplo /dev/pts/0
) e então o processo do terminal se bifurca (eu acho?), configura uma sessão e executa o shell.
No entanto, estou curioso para saber exatamente como isso funciona.
O que mais me confunde nesse procedimento é o seguinte:
- Achei que meu emulador de terminal (pseudo-terminal) é,
xterm-256color
já que é isso que eu recebo quando digitoecho $TERM
. Então,xterm
chamariaptmx
. No entanto, quando verifico o PPID do shell (bash), na verdade é/usr/libexec/gnome-terminal-server
. Então, estou confuso, qual é a diferença entre esses dois?xterm
Primeiro bifurca/exec/usr/libexec/gnome-terminal-server
e depois chamaptmx
e depois bifurca/exec o shell, ou o quê? - Eu pensei que a sessão fosse algo exclusivamente vinculado ao terminal. Ou seja, cada terminal tem apenas uma sessão e pronto. No entanto, quando eu investiguei mais a fundo, descobri que é "coisa do kernel" e que cada processo tem uma sessão, incluindo
/usr/libexec/gnome-terminal-server
. Por que ele então cria uma nova sessão para o bash e não usa apenas a do bash,/usr/libexec/gnome-terminal-server
já que isso é, na verdade, um terminal? - Como ele
/usr/libexec/gnome-terminal-server
sabe qual shell iniciar/executar (no meu caso bash)? Ele lê de algum lugar, posso mudar isso?
Estou curioso para saber exatamente como essas etapas funcionam.
Obrigado
$TERM não é como $SHELL e não indica o emulador de terminal real. Em vez disso, indica as capacidades do emulador de terminal – quais sequências de controle ele produzirá e aceitará. Os programas usam o valor $TERM para procurar o banco de dados 'termcap' ou 'terminfo' (veja
infocmp
) ou compará-lo com casos codificados.Infelizmente, não é um sistema muito útil nos dias modernos, pois essas entradas do terminfo DB precisam ser distribuídas para todos os sistemas para os quais você faz SSH, e assim por diante. (Boa sorte se você tiver que se conectar a sistemas que não sejam Linux!) Por exemplo, se você instalar o terminal Foot e SSH em um sistema que não tenha ouvido falar do
TERM=foot
, os programas não saberão como interagir com ele. Como resultado, a maioria dos terminais imita o Xterm e alega conformidade comxterm
ouxterm-256color
para que funcionem imediatamente.O GNOME Terminal faz exatamente isso: ele não usa /bin/xterm para nada, mas afirma compatibilidade com /bin/xterm definindo o mesmo valor $TERM que o Xterm definiria.
Os processos podem ter um 'terminal de controle' e, até onde eu sei, cada sessão do kernel também está associada a um 'terminal de controle'. Mas a palavra 'terminal' aqui não se refere ao emulador de terminal, mas ao dispositivo de terminal (o tty) – sua presença permite que o shell implemente o controle de tarefas (Ctrl-Z etc.) em seu próprio tty – então você precisa que cada dispositivo pty tenha sua própria sessão e seu próprio processo "líder" (o shell) com esse pty como o terminal de controle. Enquanto isso, o processo real do emulador de terminal (se é que existe algum!) é irrelevante para tudo isso e não precisa estar em uma sessão.
Esse é o máximo do meu conhecimento sobre sessões do kernel, então espero que outra pessoa dê uma resposta melhor.
O shell padrão é um parâmetro da sua conta de usuário, e é lido do seu
/etc/passwd
que você pode alterar usandochsh
ouusermod
(ou algum outro banco de dados de usuário através degetpwnam()
, que você pode alterar usando quaisquer métodos que sejam adequados para esse banco de dados). Usegetent passwd $USER
– oulslogins $USER
– para consultar sua entrada passwd.No GNOME Terminal, um comando personalizado pode ser definido por 'perfil' através da janela "Preferências" do aplicativo, semelhante à maioria dos outros emuladores de terminal.