sudo su 是否创建子终端?

Ree*_*jan 9 command-line bash sudo gnome-terminal su

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

$ sudo su
# exit
exit
$ 
Run Code Online (Sandbox Code Playgroud)

exit 命令不会关闭我的终端模拟器。

是儿童终端吗?

Eli*_*gan 17

同一个终端,不同的外壳。

从 shell 运行的子进程(包括子 shell)自动使用相同的终端。这sudo在任何方面都不是特定的——这通常是您从 shell 运行任何程序时的工作方式。

外壳和终端是不同的东西。一个是你用什么来在运行命令终端。shell 可以交互操作——它给你一个提示,你给它一个命令,它运行命令或显示一个关于它为什么不能的错误,这个过程重复,直到你退出 shell。或者它可以以非交互方式运行,运行脚本

即使您的终端(可能!)是模拟的,而不是物理的,但是像 Ubuntu这样的类 Unix操作系统会为您的每个终端分配设备节点,您可以使用tty命令检查您正在使用的终端。它通常是/dev/pts/0/dev/pts/1/dev/pts/2等等,对于一个终端窗口SSH连接,或/dev/tty1/dev/tty2等等,对于虚拟控制台。真正的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:~$
Run Code Online (Sandbox Code Playgroud)

您可以看到,即使按照 Yaron 的解释sudo su创建了一个新的 shell ,您使用的终端也不会改变。

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

一些技术细节

大多数命令你在一个shell中运行-比如lscpmvrmtouchwcdudfsshsusudoshbash,和许多更多-导致子进程来创建。此子进程将您的 shell 作为其父进程,但它是一个单独的程序。默认情况下,它连接到您的 shell相同的终端。

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

这些是主要的例外:

  • shell内建喜欢cd根本不创建一个新的进程,除非他们是在采用一个结构使用的子shell这里解释),如( )分组管道
  • 您可以通过异步运行命令来告诉 shell 不要等待命令完成。您可以通过以 结束命令来完成此操作&。( your-command arguments... &)
  • 您可以使用作业控制来更改 shell 等待的命令(如果有)。随着disown内置,您可以分离从终端工作。

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

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

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Run Code Online (Sandbox Code Playgroud)

或者,不那么狡猾:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Run Code Online (Sandbox Code Playgroud)


Yar*_*ron 16

一旦你执行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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行sudo su会创建一个在 PID 25203 上运行的新 bash 进程:

    $ 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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    $
    
    Run Code Online (Sandbox Code Playgroud)