Это то, что случилось, когда я казнил, 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 psRunning 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