相同的终端,不同的外壳。

相同的终端,不同的外壳。

sudo su这是我执行后发生的事情exit

$ sudo su
# exit
exit
$ 

退出命令不会关闭我的终端仿真器。

这是儿童终端吗?

答案1

相同的终端,不同的外壳。

从 shell 运行的子进程(包括子 shell)会自动使用同一个终端。这并不特定于sudo任何方式——当您从 shell 运行任何程序时,它通常都是这样工作的。

外壳和终端是不同的东西。A是你用来运行命令的终端。shell 可以交互操作——它会给你一个提示,你给它一个命令,它会运行该命令或显示无法运行的错误,这个过程会重复,直到你退出 shell。或者它可以非交互地运行,运行脚本

即使您的终端(可能!)模仿, 不是身体的, 尽管如此类UnixUbuntu 等操作系统分配设备节点到你的每个终端,你可以检查你正在使用的终端tty命令。通常是/dev/pts/0, /dev/pts/1, /dev/pts/2,ETC。, 为一个终端窗口或者SSH 连接, 或者/dev/tty1/dev/tty2ETC。, 为了虚拟控制台。实际上它的tty作用是告诉你哪个终端(如果有的话),输入取自;详情见下文。

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:~$

您可以看到,即使sudo su创建了一个新的 shell正如 Yaron 所解释的那样,您使用的终端不会改变。

当然,还有另一种方法可以观察到终端是相同的:您仍然以相同的方式在同一个地方写入输入,并以相同的方式在同一个地方读取输出。

一些技术细节

最多在 shell中运行的命令 - 例如lscpmvrmtouchwcdudf、、、和sshsusudoshbash许多更多——导致子进程要创建。此子进程以您的 shell 作为其父进程,但它是一个单独的程序。默认情况下,它连接到相同的终端作为你的shell。

你的 shell 仍在运行,但它在后台等待程序终止(或等待你暂停)。当程序终止时,shell 仍在运行,它会恢复操作,提示您输入下一个命令。

以下是主要例外情况:

虽然我不会认为这是子进程连接到与其父进程相同的终端的例外,但请注意,从终端中的 shell 运行的进程将不是始终从该终端获取输入或向该终端发送输出:

由于该tty命令仅检查其标准输入是哪个终端,因此您可以“欺骗”它:

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0

或者更直白地说:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty

答案2

一旦你执行sudo su或者一个新的shell被创建。su user

执行exit(或Ctrl+ D) 将退出新创建的 shell 并返回到您之前的 shell。

  1. 起点-bash shell 在 PID 25050 上运行:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
    
  2. 运行将sudo su创建一个新的 bash 进程,该进程在 PID 25203 上运行:

    $ sudo su
    # ps
      PID TTY          TIME CMD
    25201 pts/17   00:00:00 sudo
    25202 pts/17   00:00:00 su
    25203 pts/17   00:00:00 bash
    25213 pts/17   00:00:00 ps
    # exit
    
  3. 退出sudo su并返回起点 - bash shell 正在 PID 25050 上运行:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
    

相关内容