Mesmo terminal, shell diferente.
Processos filho executados a partir de um shell, incluindo shells filho, usam o mesmo terminal automaticamente. Isso não é específico para sudo
de qualquer forma - geralmente é assim que funciona quando você executa qualquer programa do seu shell.
Conchas e terminais são coisas diferentes. A shell é o que você usa para executar comandos em um terminal . Um shell pode operar de forma interativa - ele fornece um prompt, você fornece um comando, executa o comando ou mostra um erro sobre o motivo pelo qual ele não pode, e o processo é repetido até que você saia do shell. Ou pode operar de forma não interativa, executando um script .
Mesmo que seu terminal seja (provavelmente!) emulado , não físico , no entanto sistemas operacionais semelhantes ao Unix como o Ubuntu atribui nós de dispositivos para cada um dos seus terminais, e você pode verificar qual terminal está usando com o comando tty
. Geralmente, serão /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, etc. , para uma janela do terminal ou conexão SSH , ou /dev/tty1
, /dev/tty2
, etc. , para consoles virtuais . Realmente o que o tty
faz é informar qual terminal, se houver, entrada está sendo tirado de; veja abaixo para detalhes.
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$
Você pode ver isso, mesmo que sudo su
crie um novo shell como o Yaron explica muito bem , o terminal que você está usando não muda.
Claro, há outra maneira de observar que o terminal é o mesmo: você ainda está escrevendo a entrada da mesma maneira e no mesmo lugar, e lendo a saída da mesma maneira e no mesmo lugar.
Alguns detalhes técnicos
A maioria dos comandos executados em um shell - como ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
e muitos mais - causa um child process a ser criado. Este processo filho tem seu shell como pai, mas é um programa separado. Por padrão, ele está conectado ao terminal same como seu shell.
Seu shell ainda está em execução, mas aguarda em segundo plano pelo final do programa (ou por você para suspendê-lo ). Quando o programa termina, o shell ainda está em execução e retoma a operação, solicitando o próximo comando.
Estas são as principais exceções:
Embora eu realmente não considere isso uma exceção a processos filhos conectados ao mesmo terminal que seus pais, note que um processo que você executa a partir de um shell em um terminal não sempre estará entrada desse terminal ou envio de saída para esse terminal:
Como o comando tty
só verifica qual terminal é sua entrada padrão, você pode "enganá-lo":
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Ou, menos deviously:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty