これは私が実行したsudo su
後に起こったことですexit
$ sudo su
# exit
exit
$
exitコマンドで端末エミュレータが閉じません。
子端末ですか?
これは私が実行した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
方法に固有のものではありません。これは通常、シェルからプログラムを実行するときに機能する方法です。
シェルとターミナルは別物です。シェルは、あなたがコマンドを実行するために使用するものであるターミナル。シェルはインタラクティブに操作できます。プロンプトが表示され、コマンドを入力し、コマンドを実行するか、それができない理由に関するエラーが表示され、シェルを終了するまでプロセスが繰り返されます。または、スクリプトを実行して非対話的に動作することもできます。
端末は(おそらく!)エミュレートされ、物理的ではありませんが、UbuntuのようなUnixライクなオペレーティングシステムは各端末にデバイスノードを割り当て、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:~$
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