Bu benim akdedilmiş zaman böyle oldu sudo su
, ardındanexit
$ sudo su
# exit
exit
$
Çıkış komutu terminal öykünücümü kapatmıyor.
Çocuk terminali mi?
Bu benim akdedilmiş zaman böyle oldu sudo su
, ardındanexit
$ sudo su
# exit
exit
$
Çıkış komutu terminal öykünücümü kapatmıyor.
Çocuk terminali mi?
Yanıtlar:
Bir kez yürüttüğünüzde sudo su
veya yeni bir kabuk oluşturuluyor.su user
exit
(Veya Ctrl+ D) yürütülmesi yeni oluşturulan kabuktan çıkar ve sizi önceki kabuğunuza döndürür.
Başlangıç noktası - bash kabuğu PID 25050'de çalışıyor:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25200 pts/17 00:00:00 ps
Running sudo su
, PID 25203 üzerinde çalışan yeni bir bash işlemi oluşturur:
$ 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
Çıkış sudo su
noktasından çıkıp başlangıç noktasına geri dönme - bash kabuğu PID 25050'de çalışıyor:
$ ps
PID TTY TIME CMD
25050 pts/17 00:00:00 bash
25214 pts/17 00:00:00 ps
$
Kabuklardan çalıştırdığınız alt süreçler, alt kabuklar da dahil olmak üzere, aynı terminali otomatik olarak kullanır. Bu sudo
hiçbir şekilde spesifik değildir - kabuğunuzdan herhangi bir program çalıştırdığınızda bu genellikle böyle çalışır.
Kabuklar ve terminaller farklı şeylerdir. Bir kabuk bir komutları çalıştırmak için kullandığınız terminali . Kabuk etkileşimli olarak çalışabilir - size bir komut istemi verir, ona bir komut verir, komutu çalıştırır veya neden yapılamadığına dair bir hata gösterir ve kabuktan çıkıncaya kadar işlem tekrarlanır. Veya etkileşimli olarak çalışarak bir komut dosyası çalıştırabilir .
Terminaliniz taklit edilmiş olsa da (muhtemelen!) Ubuntu gibi Unix benzeri işletim sistemleri fiziksel değil , her bir terminalinize cihaz düğümleri atar ve komutla hangi terminali kullandığınızı kontrol edebilirsiniz . Genellikle olacak , , , vb bir için, terminal penceresinde veya SSH bağlantısı veya , , vb için, sanal konsolları . Gerçekten ne yaparsa, hangi terminalin (eğer varsa) girdinin alındığını söylemek ; ayrıntılar için aşağıya bakın.tty
/dev/pts/0
/dev/pts/1
/dev/pts/2
/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'un çok iyi açıkladığı gibisudo su
yeni bir kabuk oluştursa da , kullandığınız terminalin değişmediğini görebilirsiniz.
Tabii ki, terminalin aynı olduğunu gözlemlemenin başka bir yolu var: girişi aynı şekilde ve aynı yerde yazıyorsunuz ve çıktıyı aynı şekilde ve aynı yerde okuyorsunuz.
Çoğu komutlar Kabuk'ta çalıştırmak - örneğin ls
, cp
, mv
, rm
, touch
, wc
, du
, df
, ssh
, su
, sudo
, sh
, bash
, ve birçok daha fazlası - neden çocuk süreç oluşturulacak. Bu alt süreç kabuğunuzu üst öğesi olarak kullanır ancak ayrı bir programdır. Varsayılan olarak, kabuğunuzla aynı terminale bağlıdır .
Kabuğunuz hala çalışıyor, ancak programın sonlandırılmasını (veya askıya almanızı ) arka planda bekliyor . Program sona erdiğinde, kabuk hala çalışmaya devam eder ve çalışmaya devam ederek bir sonraki komutunuzu ister.
Bunlar büyük istisnalar:
cd
bir kullanan bir yapıda kullanılan sürece tüm yeni bir işlem oluşturmak olmayan altkabuk ( burada açıklandığı gibi), (
)
gruplama ve boru hatları .&
. ( your-command arguments... &
)disown
Gerçekten bu çocuk süreçler ebeveynlerinin, not olarak aynı terminaline bağlı olan bir istisnası dikkate olmaz olsa bir terminalde bir kabuk çalıştırmak bir süreç olacağı değil her zaman terminale o terminal veya gönderme çıkışından girdi alarak olmak :
<
, >
ve >>
operatörler.|
.Yana tty
standart girdidir terminali hangi komut sadece denetler, bunu "aptal" olabilir:
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0
Veya daha az hırsla:
ek@Io:~$ tty </dev/null # not a terminal
not a tty
ek@Io:~$ tty <&- # closes the input stream
not a tty