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中运行-比如ls,cp,mv,rm,touch,wc,du,df,ssh,su,sudo,sh,bash,和许多更多-导致子进程来创建。此子进程将您的 shell 作为其父进程,但它是一个单独的程序。默认情况下,它连接到与您的 shell相同的终端。
您的 shell 仍在运行,但它在后台等待程序终止(或让您暂停它)。当程序终止时,shell 仍在运行并恢复运行,提示您输入下一个命令。
这些是主要的例外:
cd根本不创建一个新的进程,除非他们是在采用一个结构使用的子shell(这里解释),如( )分组和管道。&。( your-command arguments... &)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。
起点 - 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)运行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)退出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)