답변:
당신이 실행 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
실행 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
종료 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
어떤 식 으로든 특정 적이 지 않으며, 일반적으로 쉘에서 프로그램을 실행할 때 작동하는 방식입니다.
쉘과 터미널은 다릅니다. 쉘은 당신이에서 명령을 실행하는 데 사용하는 것입니다 터미널 . 쉘은 대화식으로 작동 할 수 있습니다. 프롬프트를 표시하고 명령을 내리거나 명령을 실행하거나 실패 할 수없는 이유에 대한 오류를 표시하며 쉘을 종료 할 때까지 프로세스가 반복됩니다. 또는 스크립트를 실행 하여 비 대화식으로 작동 할 수 있습니다 .
터미널이 (아마도!)하더라도 에뮬레이트 하지 물리적 , 그럼에도 불구하고 유닉스 계열 우분투 할당과 같은 운영 체제 장치 노드 하여 각 단자에, 당신은 당신이 함께 사용하는 터미널을 확인할 수 있습니다 tty
명령. 그것은 일반적으로 될 것입니다 /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, 등 A에 대한, 터미널 창 또는 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
하는 것처럼 새로운 쉘 을 생성 하더라도 사용중인 터미널은 변경되지 않음을 알 수 있습니다.
물론 터미널이 동일한 지 관찰하는 또 다른 방법이 있습니다. 입력을 같은 방식으로 같은 장소에 쓰고 동일한 방법으로 같은 장소에서 출력을 읽는 것입니다.
대부분의 명령은 쉘에서 실행 - 같은 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