Inilah yang terjadi ketika saya dieksekusi sudo su
diikuti olehexit
$ sudo su
# exit
exit
$
Perintah keluar tidak menutup emulator terminal saya.
Apakah ini terminal anak?
Inilah yang terjadi ketika saya dieksekusi sudo su
diikuti olehexit
$ sudo su
# exit
exit
$
Perintah keluar tidak menutup emulator terminal saya.
Apakah ini terminal anak?
Jawaban:
Setelah Anda mengeksekusi sudo su
atau shell baru sedang dibuat.su user
Eksekusi exit
(atau Ctrl+ D) akan keluar dari shell yang baru dibuat dan akan mengembalikan Anda ke shell sebelumnya.
Titik awal - bash shell dijalankan pada PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
Menjalankan sudo su
menciptakan proses bash baru yang berjalan pada 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
Keluar sudo su
dan kembali ke titik awal - bash shell berjalan pada PID 25050:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
Proses anak yang Anda jalankan dari shell, termasuk shell anak, menggunakan terminal yang sama secara otomatis. Ini tidak spesifik untuk sudo
cara apa pun - ini umumnya cara kerjanya ketika Anda menjalankan program apa pun dari shell Anda.
Kerang dan terminal adalah hal yang berbeda. Sebuah shell adalah apa yang Anda gunakan untuk menjalankan perintah dalam terminal . Shell dapat beroperasi secara interaktif - ia memberi Anda prompt, Anda memberikannya perintah, menjalankan perintah atau menunjukkan kesalahan tentang mengapa ia tidak bisa, dan proses berulang sampai Anda keluar dari shell. Atau dapat beroperasi secara nonaktif, menjalankan skrip .
Meskipun terminal Anda (mungkin!) Dicontoh , bukan fisik , sistem operasi mirip Unix seperti Ubuntu menetapkan node perangkat ke masing-masing terminal Anda, dan Anda dapat memeriksa terminal apa yang Anda gunakan dengan tty
perintah. Ini biasanya akan /dev/pts/0
, /dev/pts/1
, /dev/pts/2
, dll , untuk jendela terminal atau koneksi SSH , atau /dev/tty1
, /dev/tty2
, dll , untuk konsol virtual . Sebenarnya apa yang harus tty
dilakukan adalah memberi tahu Anda dari terminal mana, jika ada, input diambil; lihat di bawah untuk detailnya.
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:~$
Anda dapat melihat itu, meskipun sudo su
membuat shell baru seperti yang dijelaskan Yaron dengan sangat baik , terminal yang Anda gunakan tidak berubah.
Tentu saja, ada cara lain untuk mengamati bahwa terminalnya sama: Anda masih menulis input dengan cara yang sama dan di tempat yang sama, dan membaca output dengan cara yang sama dan di tempat yang sama.
Sebagian besar perintah yang dijalankan dalam shell - seperti ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
, dan banyak lagi - menyebabkan proses anak yang akan dibuat. Proses anak ini memiliki shell Anda sebagai induknya tetapi merupakan program yang terpisah. Secara default, ini terhubung ke terminal yang sama dengan shell Anda.
Shell Anda masih berjalan, tetapi menunggu di latar belakang program untuk menghentikan (atau Anda untuk menangguhkannya ). Ketika program berakhir, shell masih berjalan dan melanjutkan operasi, meminta Anda untuk perintah Anda berikutnya.
Ini adalah pengecualian utama:
cd
tidak membuat proses baru sama sekali, kecuali mereka digunakan dalam konstruksi yang menggunakan subkulit ( dijelaskan di sini ), seperti (
)
pengelompokan dan jalur pipa .&
. ( your-command arguments... &
)disown
builtin , Anda dapat melepaskan pekerjaan dari terminal Anda.Meskipun saya tidak akan benar-benar menganggap ini pengecualian untuk proses anak yang terhubung ke terminal yang sama dengan orang tua mereka, perhatikan bahwa proses yang Anda jalankan dari shell di terminal tidak akan selalu mengambil input dari terminal itu atau mengirim output ke terminal itu :
<
, >
, dan >>
operator.|
.Karena tty
perintah hanya memeriksa terminal mana input standarnya, Anda dapat "membodohinya":
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Atau, yang kurang jelas:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty