这就是我执行sudo su
后发生的情况exit
$ sudo su
# exit
exit
$
exit命令不会关闭我的终端仿真器。
是儿童码头吗?
这就是我执行sudo su
后发生的情况exit
$ sudo su
# exit
exit
$
exit命令不会关闭我的终端仿真器。
是儿童码头吗?
Answers:
一旦执行sudo su
或正在创建新的外壳。su user
执行exit
(或Ctrl+ D)将退出新创建的外壳,并使您返回上一个外壳。
起点-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
$
从外壳程序运行的子进程(包括子外壳程序)会自动使用同一终端。这不是以sudo
任何方式特定的,这通常是您从shell运行任何程序时的工作方式。
外壳和端子是不同的东西。一个壳是你用什么来在运行命令终端。Shell可以交互操作-它会提示您,给您一个命令,运行该命令或显示有关其为什么无法执行的错误,然后重复该过程,直到您退出该Shell。或者,它可以非交互式地运行脚本。
即使您的终端是(可能是)模拟的,而不是物理的,但是像Unix这样的类Unix操作系统(如Ubuntu)仍将设备节点分配给每个终端,并且您可以通过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:~$
您可以看到,即使按照Yaron的解释sudo su
创建了一个新的Shell ,您使用的终端也不会改变。
当然,还有另一种方法可以观察到终端是相同的:您仍在以相同的方式和位置写输入,并以相同的方式和位置读输出。
大多数命令你在一个shell中运行-比如ls
,cp
,mv
,rm
,touch
,wc
,du
,df
,ssh
,su
,sudo
,sh
,bash
,和许多更多-导致子进程来创建。该子进程将您的shell作为其父进程,但是它是一个单独的程序。默认情况下,它与外壳连接到同一终端。
您的shell仍在运行,但是它在后台等待程序终止(或让您挂起它)。程序终止时,shell仍在运行,并且继续运行,提示您输入下一条命令。
这些是主要的例外:
cd
函数根本不会创建新进程,除非将它们用于采用subshell(在此说明)的构造中,例如(
)
grouping和pipeline。&
。(your-command arguments... &
)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