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/tty2
,ETC。, 为了虚拟控制台。实际上它的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中运行的命令 - 例如ls
、cp
、mv
、rm
、touch
、wc
、du
、df
、、、和ssh
su
sudo
sh
bash
许多更多——导致子进程要创建。此子进程以您的 shell 作为其父进程,但它是一个单独的程序。默认情况下,它连接到相同的终端作为你的shell。
你的 shell 仍在运行,但它在后台等待程序终止(或等待你暂停)。当程序终止时,shell 仍在运行,它会恢复操作,提示您输入下一个命令。
以下是主要例外情况:
- Shell 内建命令比如
cd
根本不创建新的进程,除非它们被用在采用子壳(这里解释), 例如(
)
分组和管道。 - 你可以通过以下方式告诉 shell 不要等待命令完成运行命令异步地. 您可以通过在命令末尾添加
&
. (your-command arguments... &
)来执行此操作 - 您可以使用作业控制更改 shell 等待的命令(如果有)。使用内置
disown
,您可以从终端分离作业。
虽然我不会认为这是子进程连接到与其父进程相同的终端的例外,但请注意,从终端中的 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。
起点-bash shell 在 PID 25050 上运行:
$ ps PID TTY TIME CMD 25050 pts/17 00:00:00 bash 25200 pts/17 00:00:00 ps
运行将
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
退出
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 $