Это то, что случилось, когда я казнил, sudo su
а затемexit
$ sudo su
# exit
exit
$
Команда выхода не закрывает мой эмулятор терминала.
Это дочерний терминал?
Это то, что случилось, когда я казнил, sudo su
а затемexit
$ sudo su
# exit
exit
$
Команда выхода не закрывает мой эмулятор терминала.
Это дочерний терминал?
Ответы:
После того, как вы выполните sudo su
или новая оболочка создается.su user
Выполнение exit
(или Ctrl+ D) закроет вновь созданную оболочку и вернет вас к предыдущей оболочке.
Начальная точка - оболочка bash работает на PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
Running 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 работает на 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