Это - то, что произошло, когда я выполнился sudo su
сопровождаемый exit
$ sudo su
# exit
exit
$
Команда выхода не закрывает мой эмулятор терминала.
Действительно ли это - дочерний терминал?
После того как Вы выполняетесь sudo su
или su user
создается, новая оболочка.
Выполнение exit
(или Ctrl + D ) выйдет, недавно создают оболочку и возвратит Вас Вашей предыдущей оболочке.
Начальная точка - оболочка удара работает на PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
Выполнение sudo su
создает новый процесс удара, который работает на 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
и возвращаться к начальному вопросу - оболочка удара работает на PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
Дочерние процессы, которые Вы выполняете от оболочки, включая дочерние оболочки, используют тот же терминал автоматически. Это не характерно для sudo
всегда - это обычно, как это работает, когда Вы запускаете любую программу от своей оболочки.
Оболочки и терминалы являются разными вещами. Оболочка - то, что Вы используете для команд выполнения в терминале. Оболочка может работать в интерактивном режиме - она дает Вам подсказку, Вы даете ей команду, она выполняет команду или показывает ошибку о том, почему она не может, и повторения процесса, пока Вы не выходите из оболочки. Или это может работать нев интерактивном режиме, запуская скрипт.
Даже при том, что Ваш терминал (вероятно!) эмулированный, не физический, тем не менее, подобные 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:~$
Вы видите это, даже при том, что sudo su
создает новую оболочку, как Yaron очень хорошо объясняет, терминал, который Вы используете, не изменяется.
Конечно, существует другой способ заметить, что терминал является тем же: Вы все еще пишете, вводит тот же путь и в том же месте, и чтение произвело тот же путь и в том же месте.
Большинство команд Вы работаете в оболочке - такой как ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
, и намного более - заставляют дочерний процесс быть созданным. Этот дочерний процесс имеет Вашу оболочку как своего родителя, но это - отдельная программа. По умолчанию это подключено к тому же терминалу как Ваша оболочка.
Ваша оболочка все еще работает, но она ожидает в фоновом режиме, чтобы программа завершилась (или чтобы Вы приостановили ее). Когда программа завершается, оболочка все еще работает, и она возобновляет операцию, предлагая Вам Вашу следующую команду.
Это основные исключения:
cd
не создавайте новый процесс вообще, если они не используются в конструкции, которая использует подоболочку (объясненный здесь), такой как (
)
группировка и конвейеры.&
. (your-command arguments... &
)disown
встроенный, можно отсоединить задания от терминала.Хотя я действительно не рассмотрел бы это, исключение к дочерним процессам, подключаемым к тому же терминалу как их родитель, отмечает, что процесс, который Вы выполняете от оболочки в терминале, будет не всегда брать вход от того терминала или отправлять вывод на тот терминал:
<
, >
, и >>
операторы.|
.Начиная с 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