これは、Sudo su
に続いてexit
を実行したときに起こったことです。
$ Sudo su
# exit
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
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
に特定の方法ではありません。これは一般に、シェルからプログラムを実行するときの動作です。
シェルとターミナルは異なるものです。 A Shell は、コマンドを実行するために使用するものです terminal シェルは対話的に動作できます。プロンプトを表示したり、コマンドを実行したり、コマンドを実行したり、実行できない理由に関するエラーを表示したり、シェルを終了するまでプロセスを繰り返します。または、 スクリプト を実行して、非対話的に動作できます。
端末は(おそらく!) エミュレート ではなく 物理 ですが、それでも nixのような Ubuntuのようなオペレーティングシステムは デバイスノード 各端末に対して、 tty
コマンドを使用して、使用している端末を確認できます。通常、/dev/pts/0
、/dev/pts/1
、/dev/pts/2
、 etc。 、 ターミナルウィンドウ または SSH接続の場合) 、または/dev/tty1
、/dev/tty2
、 etc。 、 仮想コンソール の場合。本当にtty
が行うことは、 input がどの端末から取得されているかを示すことです。詳細は以下をご覧ください。
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
、およびmanymore -- child process が作成されるため。この子プロセスには親としてシェルがありますが、別のプログラムです。 デフォルトでは、シェルと同じsame端末に接続されます。
シェルはまだ実行中ですが、プログラムが終了するのをバックグラウンドで待機します(または サスペンドする )。プログラムが終了しても、シェルはまだ実行中で動作を再開し、次のコマンドの入力を求めます。
主な例外は次のとおりです。
cd
のように、 サブシェル (- ここで説明 ) (
)
grouping や pipelines など。&
で終了します。 (your-command arguments... &
)disown
builtin を使用すると、端末からジョブを切断できます。私はこれを親と同じ端末に接続されている子プロセスの例外とは本当に考えていませんが、端末のシェルから実行するプロセスは常にnotその端末からの入力またはその端末への出力の送信:
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